private LotInfo SplitLot(LotInfo distinctLot, bool isRelative, TransactionStamp txnStamp) { LotInfo lotData = LotInfo.GetLotByLot(distinctLot.Lot); List <SqlAgent> splitLotArchiSQLList = new List <SqlAgent>(); List <ComponentInfo> lsComponentDatas = new List <ComponentInfo>(); if (isRelative) { // 找出相同批號的所有Component _RelativePackingList.FindAll(lot => lot.LotInfo.Lot == lotData.Lot).ForEach(pack => { lsComponentDatas.Add(ComponentInfo.GetComponentByComponentID(pack.ComponentID)); }); } else { // 找出相同批號的所有Component _PackingList.FindAll(lot => lot.LotInfo.Lot == lotData.Lot).ForEach(pack => { lsComponentDatas.Add(ComponentInfo.GetComponentByComponentID(pack.ComponentID)); }); } var generator = NamingIDGenerator.GetRule("SplitLot"); if (generator == null) { //WRN-00411,找不到可產生的序號,請至命名規則維護設定,規則名稱:{0}!!! throw new Exception(TextMessage.Error.T00437("SplitLot")); } var serialData = generator.GenerateNextIDs(1, lotData, new string[] { }, User.Identity.Name); splitLotArchiSQLList = serialData.Second; var splitLotID = serialData.First[0]; var reasonCategoryInfo = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("Common", "OTHER"); SplitLotInfo splitLotData = SplitLotInfo.CreateSplitLotByLotAndQuantity(lotData.Lot, splitLotID, lsComponentDatas, reasonCategoryInfo, "Pack"); WIPTxn.SplitIndicator splitInd = WIPTxn.SplitIndicator.Create(); // 拆批交易 WIPTxn.Default.SplitLot(lotData, splitLotData, splitInd, txnStamp); //若子單元為自動產生,更新序號至DB if (splitLotArchiSQLList != null && splitLotArchiSQLList.Count > 0) { DBCenter.ExecuteSQL(splitLotArchiSQLList); } return(LotInfo.GetLotByLot(splitLotID)); }
/// <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) { _SelectLotDatas.ForEach(lot => { //將勾選的入庫資料塞到ERP TEMP表 To do... //將入庫單號回寫到INVNO WIPTransaction.ModifyLotSystemAttribute(lot, "INVNO", ttbScrapNo.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); } }
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); } }
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); } }
/// <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 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="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 }); }
protected void btnOK_Click(object sender, EventArgs e) { try { // 包裝數量必須符合滿箱數量,否則須拋錯 if (!ckbNoControl.Checked && _PackType == "Standard" && (_PackingList.Count + _RelativePackingList.Count) != ttbMaxPackSize.Text.ToDecimal()) { throw new RuleCimesException(RuleMessage.Error.C10043((_PackingList.Count + _RelativePackingList.Count).ToString(), ttbMaxPackSize.Text)); } // 若包裝方式為左右手,則左右手的輸入數量需相同 if (!ckbNoControl.Checked && _PackType == "Mix" && _PackingList.Count != _RelativePackingList.Count) { throw new RuleCimesException(RuleMessage.Error.C10044(_DeviceName, _PackingList.Count.ToString(), _RelativeDeviceName, _RelativePackingList.Count.ToString())); } // 若包裝方式為左右手,則左右手的輸入數量需相同且需符合滿箱數量乘以二 if (!ckbNoControl.Checked && _PackType == "Mix" && (_PackingList.Count + _RelativePackingList.Count) != (ttbMaxPackSize.Text.ToDecimal() * 2)) { throw new RuleCimesException(RuleMessage.Error.C10043((_PackingList.Count + _RelativePackingList.Count).ToString(), (ttbMaxPackSize.Text.ToDecimal() * 2).ToString())); } if (ddlInspector.SelectedValue.IsNullOrEmpty()) { //[00826] 請輸入{0}! throw new RuleCimesException(TextMessage.Error.T00826(lblInspector.Text), ddlInspector); } var lstSourceLot = new List <LotInfo>(); // 定義交易戳記 var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { // 若有不同的批號需拆批 _PackingList.Distinct <PackingInfo>(new PackCompare()).ToList().ForEach(p => { lstSourceLot.Add(SplitLot(p.LotInfo, false, txnStamp)); }); // 若有不同的批號需拆批 _RelativePackingList.Distinct <PackingInfo>(new PackCompare()).ToList().ForEach(p => { lstSourceLot.Add(SplitLot(p.LotInfo, true, txnStamp)); }); #region SplitBoxLot List <SqlAgent> splitLotArchiSQLList = new List <SqlAgent>(); var generator = NamingIDGenerator.GetRule("BoxNo"); if (generator == null) { //WRN-00411,找不到可產生的序號,請至命名規則維護設定,規則名稱:{0}!!! throw new Exception(TextMessage.Error.T00437("BoxNo")); } var serialData = generator.GenerateNextIDs(1, lstSourceLot[0], new string[] { }, User.Identity.Name); splitLotArchiSQLList = serialData.Second; var boxNoLotID = serialData.First[0]; var reasonCategoryInfo = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("Common", "OTHER"); var splitLotData = SplitLotInfo.CreateSplitLotByLotAndQuantity(lstSourceLot[0].Lot, boxNoLotID, 0, 0, reasonCategoryInfo, "SplitBoxLot"); WIPTxn.SplitIndicator splitInd = WIPTxn.SplitIndicator.Create(); WIPTxn.Default.SplitLot(lstSourceLot[0], splitLotData, splitInd, txnStamp); //若子單元為自動產生,更新序號至DB if (splitLotArchiSQLList != null && splitLotArchiSQLList.Count > 0) { DBCenter.ExecuteSQL(splitLotArchiSQLList); } #endregion var targetLot = LotInfo.GetLotByLot(boxNoLotID); // 將批號轉換為另一個批號的子單元,轉換後批號結批,例如可使用於包裝 WIPTxn.Default.ConvertToComponent(targetLot, lstSourceLot, "Box", WIPTxn.ConvertToComponentIndicator.Default, txnStamp); // 紀錄檢驗人員 //WIPTransaction.ModifyLotSystemAttribute(targetLot, "USERDEFINECOL12", ddlInspector.SelectedValue, txnStamp); // 進行Dispatch WIPTransaction.DispatchLot(targetLot, txnStamp); // 刪除暫存檔案 if (_BatchID != "") { CSTWIPPackTempInfo.DeletePackTempByBatchID(_BatchID); } var packInfo = InfoCenter.Create <CSTWIPPackInfo>(); packInfo.BOXNO = boxNoLotID; packInfo.Quantity = _PackingList.Count + _RelativePackingList.Count; packInfo.INSPUSER = ddlInspector.SelectedValue; packInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); _PackingList.ForEach(comp => { var packDataInfo = InfoCenter.Create <CSTWIPPackDataInfo>(); packDataInfo.WIP_PACK_SID = packInfo.ID; packDataInfo.ComponentID = comp.ComponentID; packDataInfo.DMC = comp.DMC; packDataInfo.DeviceName = comp.Device; packDataInfo.Quantity = 1; packDataInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); _RelativePackingList.ForEach(comp => { var packDataInfo = InfoCenter.Create <CSTWIPPackDataInfo>(); packDataInfo.WIP_PACK_SID = packInfo.ID; packDataInfo.ComponentID = comp.ComponentID; packDataInfo.DMC = comp.DMC; packDataInfo.DeviceName = comp.Device; packDataInfo.Quantity = 1; packDataInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); //工時 _UserWorkTimeList.ForEach(p => { p.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); _UserWorkTimeList.Clear(); #region Print _dsReport = new DataSet(); // 取得Report資料 _dsReport = GetRunCardDataSource(targetLot); _dsReport.AcceptChanges(); if (_dsReport.Tables.Count > 0) { string sPrintProgram = "/CustomizeRule/WIPRule/W035View.aspx"; string sHost = Request.Url.Host; string sApplicationPath = Request.ApplicationPath; string ReportPath = "http://" + sHost + sApplicationPath + sPrintProgram; Session["W035View"] = _dsReport; //開啟查詢工單頁面 string openPrintWindow = "window.open('" + ReportPath + "','pop','resizable: yes; status: no; scrollbars:no; menubar:no;toolbar:no;location:no;dialogLeft:10px;dialogTop:10px;dialogHeight:10px;dialogWidth:10px',false);"; ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), Guid.NewGuid().ToString(), openPrintWindow, true); } #endregion cts.Complete(); } // ClearUI不會清除Device資料 ttbDeviceName.Text = ""; ClearField(); //ReturnToPortal(); } catch (Exception ex) { HandleError(ex); } }