/// <summary> /// 保存,返修批次。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tsbOK_Click(object sender, EventArgs e) { if (this.gvHoldInfoList.State == GridState.Editing && this.gvHoldInfoList.IsEditorFocused && this.gvHoldInfoList.EditingValueModified) { this.gvHoldInfoList.SetFocusedRowCellValue(this.gvHoldInfoList.FocusedColumn, this.gvHoldInfoList.EditingValue); } this.gvHoldInfoList.UpdateCurrentRow(); //待返工批次信息 DataTable dtLotInfo = this.gcLotList.DataSource as DataTable; if (dtLotInfo == null || dtLotInfo.Rows.Count < 1) { MessageService.ShowMessage("待返工批次信息列表至少要有一条记录。", "提示"); return; } //暂停信息 DataTable dtHoldInfo = this.gcHoldInfoList.DataSource as DataTable; if (dtHoldInfo.Rows.Count < 1) { MessageService.ShowMessage("暂停信息列表至少要有一条记录。", "提示"); return; } string newEnterpriseName = this.beEnterpriseName.Text; string newEnterpriseKey = Convert.ToString(this.beEnterpriseName.Tag); string newRouteName = this.teRouteName.Text; string newRouteKey = Convert.ToString(this.teRouteName.Tag); string newStepName = this.teStepName.Text; string newStepKey = Convert.ToString(this.teStepName.Tag); //返工工艺流程必须选择 if (string.IsNullOrEmpty(newStepKey)) { MessageService.ShowMessage("请选择工艺流程。", "提示"); this.beEnterpriseName_ButtonClick(this.teStepName, new ButtonPressedEventArgs(new EditorButton())); return; } string remark = this.teRemark.Text.Trim(); if (string.IsNullOrEmpty(remark)) { MessageService.ShowMessage("备注必须输入。", "提示"); this.teRemark.Select(); return; } StringBuilder afterContent = new StringBuilder(); afterContent.AppendFormat("工艺流程组:{0};", newEnterpriseName); afterContent.AppendFormat("工艺流程:{0};", newRouteName); afterContent.AppendFormat("工序:{0};", newStepName); //密码和释放密码不一致 var lnq = from item in dtHoldInfo.AsEnumerable() where Convert.ToString(item[TEMP_HOLD_LIST_RELEASE_PASSWORD]) != Convert.ToString(item[WIP_HOLD_RELEASE_FIELDS.FIELD_HOLD_PASSWORD]) select item; foreach (var item in lnq) { MessageService.ShowMessage("释放密码和暂停密码不一致,请确认。", "提示"); this.gvHoldInfoList.FocusedColumn = this.gclPassword; this.gvHoldInfoList.FocusedRowHandle = dtHoldInfo.Rows.IndexOf(item); this.gvHoldInfoList.ShowEditor(); return; } string shiftName = this._model.ShiftName; string shiftKey = string.Empty; //Shift shiftEntity = new Shift(); //string shiftKey = shiftEntity.IsShiftValueExists(shiftName);//班次主键。 ////获取班次主键失败。 //if (!string.IsNullOrEmpty(shiftEntity.ErrorMsg)) //{ // MessageService.ShowError(shiftEntity.ErrorMsg); // return; //} ////没有排班。 //if (string.IsNullOrEmpty(shiftKey)) //{ // MessageService.ShowMessage("请先在系统中进行排班。", "提示"); // return; //} string oprComputer = PropertyService.Get(PROPERTY_FIELDS.COMPUTER_NAME); string timezone = PropertyService.Get(PROPERTY_FIELDS.TIMEZONE); DataSet dsParams = new DataSet(); //存放批次返工信息。 Hashtable htMaindata = new Hashtable(); htMaindata.Add(POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY, newEnterpriseKey); htMaindata.Add(POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY, newRouteKey); htMaindata.Add(POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY, newStepKey); DataTable dtMaindata = CommonUtils.ParseToDataTable(htMaindata); dtMaindata.TableName = TRANS_TABLES.TABLE_MAIN_DATA; //存放待返工的批次的操作数据 WIP_TRANSACTION_FIELDS transFields = new WIP_TRANSACTION_FIELDS(); DataTable dtTransaction = CommonUtils.CreateDataTable(transFields); //存在批次返工操作的明细记录。 WIP_COMMENT_FIELDS commentFileds = new WIP_COMMENT_FIELDS(); DataTable dtComment = CommonUtils.CreateDataTable(commentFileds); foreach (DataRow dr in dtLotInfo.Rows) { string transKey = CommonUtils.GenerateNewKey(0); string lotKey = Convert.ToString(dr[POR_LOT_FIELDS.FIELD_LOT_KEY]); //组织待返工的批次的操作数据 DataRow drTransaction = dtTransaction.NewRow(); dtTransaction.Rows.Add(drTransaction); drTransaction[WIP_TRANSACTION_FIELDS.FIELD_TRANSACTION_KEY] = transKey; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_PIECE_KEY] = lotKey; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY] = ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_REWORK; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_IN] = dr[POR_LOT_FIELDS.FIELD_QUANTITY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_OUT] = dr[POR_LOT_FIELDS.FIELD_QUANTITY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ENTERPRISE_KEY] = dr[POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ENTERPRISE_NAME] = dr[POR_ROUTE_ENTERPRISE_VER_FIELDS.FIELD_ENTERPRISE_NAME]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ROUTE_KEY] = dr[POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ROUTE_NAME] = dr[POR_ROUTE_ROUTE_VER_FIELDS.FIELD_ROUTE_NAME]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_STEP_KEY] = dr[POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_STEP_NAME] = dr[POR_ROUTE_STEP_FIELDS.FIELD_ROUTE_STEP_NAME]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_WORK_ORDER_KEY] = dr[POR_LOT_FIELDS.FIELD_WORK_ORDER_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_KEY] = shiftKey; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME] = shiftName; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_STATE_FLAG] = dr[POR_LOT_FIELDS.FIELD_STATE_FLAG]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_REWORK_FLAG] = dr[POR_LOT_FIELDS.FIELD_IS_REWORKED]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_OPERATOR] = this._model.UserName; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_OPR_COMPUTER] = oprComputer; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_LINE_KEY] = dr[POR_LOT_FIELDS.FIELD_CUR_PRODUCTION_LINE_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_OPR_LINE] = dr[POR_LOT_FIELDS.FIELD_OPR_LINE]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_OPR_LINE_PRE] = dr[POR_LOT_FIELDS.FIELD_OPR_LINE_PRE]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDC_INS_KEY] = dr[POR_LOT_FIELDS.FIELD_EDC_INS_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EQUIPMENT_KEY] = dr[EMS_EQUIPMENTS_FIELDS.FIELD_EQUIPMENT_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY_COMMENT] = remark; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDITOR] = this._model.UserName; //用于暂存序列号批次信息最后的编辑时间,以便判断序列号信息是否过期。 drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME] = dr[POR_LOT_FIELDS.FIELD_EDIT_TIME]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY] = timezone; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_TIME_STAMP] = DBNull.Value; //组织新的工艺流程数据 DataRow drComment = dtComment.NewRow(); dtComment.Rows.Add(drComment); drComment[WIP_COMMENT_FIELDS.FIELDS_TRANSACTION_KEY] = transKey; drComment[WIP_COMMENT_FIELDS.FIELDS_EDIT_TIMEZONE] = timezone; drComment[WIP_COMMENT_FIELDS.FIELDS_EDIT_TIME] = DBNull.Value; drComment[WIP_COMMENT_FIELDS.FIELDS_EDITOR] = this._model.UserName; drComment[WIP_COMMENT_FIELDS.FIELDS_ENTERPRISE_KEY] = newEnterpriseKey; drComment[WIP_COMMENT_FIELDS.FIELDS_ROUTE_KEY] = newRouteKey; drComment[WIP_COMMENT_FIELDS.FIELDS_STEP_KEY] = newStepKey; StringBuilder beforeContent = new StringBuilder(); beforeContent.AppendFormat("工艺流程组:{0};", dr[POR_ROUTE_ENTERPRISE_VER_FIELDS.FIELD_ENTERPRISE_NAME]); beforeContent.AppendFormat("工艺流程:{0};", dr[POR_ROUTE_ROUTE_VER_FIELDS.FIELD_ROUTE_NAME]); beforeContent.AppendFormat("工序:{0};", dr[POR_ROUTE_STEP_FIELDS.FIELD_ROUTE_STEP_NAME]); drComment[WIP_COMMENT_FIELDS.FIELDS_BEFORE_CONTENT] = beforeContent; drComment[WIP_COMMENT_FIELDS.FIELDS_AFTER_CONTENT] = afterContent; //组织暂停批次信息。 lnq = from item in dtHoldInfo.AsEnumerable() where Convert.ToString(item[POR_LOT_FIELDS.FIELD_LOT_KEY]) == lotKey select item; foreach (DataRow drHoldInfo in lnq) { drHoldInfo[WIP_HOLD_RELEASE_FIELDS.FIELD_RELEASE_TRANSACTION_KEY] = transKey; drHoldInfo[WIP_HOLD_RELEASE_FIELDS.FIELD_RELEASE_DESCRIPTION] = remark; drHoldInfo[WIP_HOLD_RELEASE_FIELDS.FIELD_RELEASE_OPERATOR] = this._model.UserName; drHoldInfo[WIP_HOLD_RELEASE_FIELDS.FIELD_RELEASE_TIMEZONE] = timezone; drHoldInfo[WIP_HOLD_RELEASE_FIELDS.FIELD_EDITOR] = this._model.UserName; drHoldInfo[WIP_HOLD_RELEASE_FIELDS.FIELD_EDIT_TIMEZONE] = timezone; } } //存放暂停明细。 DataTable dtHoldParams = dtHoldInfo.Copy(); dtHoldParams.Columns.Remove(TEMP_HOLD_LIST_RELEASE_PASSWORD); //移除临时列。 dtHoldParams.Columns.Remove(POR_LOT_FIELDS.FIELD_LOT_KEY); //移除批次主键列。 dtHoldParams.Columns.Remove(POR_LOT_FIELDS.FIELD_LOT_NUMBER); //移除批次号列。 dsParams.Tables.Add(dtMaindata); dsParams.Tables.Add(dtTransaction); dsParams.Tables.Add(dtHoldParams); dsParams.Tables.Add(dtComment); //执行(返工/返修)批次。 this._entity.LotRework(dsParams); if (!string.IsNullOrEmpty(this._entity.ErrorMsg)) { MessageService.ShowError(this._entity.ErrorMsg); } else { this.tsbCancle_Click(sender, e); } dsParams.Tables.Clear(); dtTransaction = null; dtHoldParams = null; dtComment = null; dsParams = null; }
/// <summary> /// 保存,调整批次。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tsbOK_Click(object sender, EventArgs e) { DataTable dtLotInfo = this.gcList.DataSource as DataTable; if (dtLotInfo.Rows.Count < 1) { MessageService.ShowMessage("待调整批次信息列表至少要有一条记录。", "提示"); return; } string newLotNumber = this.teLotNumber.Text.Trim().ToUpper(); string newProId = Convert.ToString(this.lueProId.EditValue); string newCreateType = Convert.ToString(this.lueCreateType.EditValue); string newLotType = Convert.ToString(this.lueLotType.EditValue); string newPriority = Convert.ToString(this.luePriority.EditValue); string newEfficiency = Convert.ToString(this.lueEfficiency.EditValue); string newSiLot = this.teSILot.Text.Trim(); string newEnterpriseName = this.beEnterpriseName.Text; string newEnterpriseKey = Convert.ToString(this.beEnterpriseName.Tag); string newRouteName = this.teRouteName.Text; string newRouteKey = Convert.ToString(this.teRouteName.Tag); string newStepName = this.teStepName.Text; string newStepKey = Convert.ToString(this.teStepName.Tag); string remark = this.teRemark.Text; //必须要输入一个调整项目。 if (string.IsNullOrEmpty(newLotNumber) && string.IsNullOrEmpty(newProId) && string.IsNullOrEmpty(newCreateType) && string.IsNullOrEmpty(newLotType) && string.IsNullOrEmpty(newPriority) && string.IsNullOrEmpty(newEfficiency) && string.IsNullOrEmpty(newSiLot) && string.IsNullOrEmpty(newStepKey)) { MessageService.ShowMessage("必须要输入一个调整项目。", "提示"); return; } //如果批次号不为空,则判断批次号是否存在。 if (!string.IsNullOrEmpty(newLotNumber)) { LotQueryEntity queryEntity = new LotQueryEntity(); DataSet dsReturn = queryEntity.GetLotInfo(newLotNumber); if (!string.IsNullOrEmpty(queryEntity.ErrorMsg)) { MessageService.ShowError(queryEntity.ErrorMsg); dsReturn = null; return; } if (dsReturn.Tables[0].Rows.Count > 0) { MessageService.ShowMessage(string.Format("【{0}】在数据库中已存在,请确认。", newLotNumber)); dsReturn = null; return; } } string shiftName = this._model.ShiftName; string shiftKey = string.Empty; //Shift shiftEntity = new Shift(); //string shiftKey = shiftEntity.IsShiftValueExists(shiftName);//班次主键。 ////获取班次主键失败。 //if (!string.IsNullOrEmpty(shiftEntity.ErrorMsg)) //{ // MessageService.ShowError(shiftEntity.ErrorMsg); // return; //} ////没有排班。 //if (string.IsNullOrEmpty(shiftKey)) //{ // MessageService.ShowMessage("请先在系统中进行排班。", "提示"); // return; //} string oprComputer = PropertyService.Get(PROPERTY_FIELDS.COMPUTER_NAME); string timezone = PropertyService.Get(PROPERTY_FIELDS.TIMEZONE); DataSet dsParams = new DataSet(); //存放新批次信息。 Hashtable htMaindata = new Hashtable(); //存放待调整的批次的操作数据 WIP_TRANSACTION_FIELDS transFields = new WIP_TRANSACTION_FIELDS(); DataTable dtTransaction = CommonUtils.CreateDataTable(transFields); //存放调整操作的明细记录。 WIP_COMMENT_FIELDS commentFileds = new WIP_COMMENT_FIELDS(); DataTable dtComment = CommonUtils.CreateDataTable(commentFileds); StringBuilder afterContent = new StringBuilder(); foreach (DataRow dr in dtLotInfo.Rows) { //组织待调整的批次的操作数据 DataRow drTransaction = dtTransaction.NewRow(); dtTransaction.Rows.Add(drTransaction); string transKey = CommonUtils.GenerateNewKey(0); drTransaction[WIP_TRANSACTION_FIELDS.FIELD_TRANSACTION_KEY] = transKey; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_PIECE_KEY] = dr[POR_LOT_FIELDS.FIELD_LOT_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY] = ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_ADJUST; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_IN] = dr[POR_LOT_FIELDS.FIELD_QUANTITY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_QUANTITY_OUT] = dr[POR_LOT_FIELDS.FIELD_QUANTITY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ENTERPRISE_KEY] = dr[POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ENTERPRISE_NAME] = dr[POR_ROUTE_ENTERPRISE_VER_FIELDS.FIELD_ENTERPRISE_NAME]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ROUTE_KEY] = dr[POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ROUTE_NAME] = dr[POR_ROUTE_ROUTE_VER_FIELDS.FIELD_ROUTE_NAME]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_STEP_KEY] = dr[POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_STEP_NAME] = dr[POR_ROUTE_STEP_FIELDS.FIELD_ROUTE_STEP_NAME]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_WORK_ORDER_KEY] = dr[POR_LOT_FIELDS.FIELD_WORK_ORDER_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_KEY] = shiftKey; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_SHIFT_NAME] = shiftName; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_STATE_FLAG] = dr[POR_LOT_FIELDS.FIELD_STATE_FLAG]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_REWORK_FLAG] = dr[POR_LOT_FIELDS.FIELD_IS_REWORKED]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_OPERATOR] = this._model.UserName; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_OPR_COMPUTER] = oprComputer; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_LINE_KEY] = dr[POR_LOT_FIELDS.FIELD_CUR_PRODUCTION_LINE_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_OPR_LINE] = dr[POR_LOT_FIELDS.FIELD_OPR_LINE]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_OPR_LINE_PRE] = dr[POR_LOT_FIELDS.FIELD_OPR_LINE_PRE]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDC_INS_KEY] = dr[POR_LOT_FIELDS.FIELD_EDC_INS_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EQUIPMENT_KEY] = dr[EMS_EQUIPMENTS_FIELDS.FIELD_EQUIPMENT_KEY]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY_COMMENT] = remark; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDITOR] = this._model.UserName; //用于暂存序列号批次信息最后的编辑时间,以便判断序列号信息是否过期。 drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME] = dr[POR_LOT_FIELDS.FIELD_EDIT_TIME]; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIMEZONE_KEY] = timezone; drTransaction[WIP_TRANSACTION_FIELDS.FIELD_TIME_STAMP] = DBNull.Value; //组织待调整的批次的明细操作数据 DataRow drComment = dtComment.NewRow(); dtComment.Rows.Add(drComment); drComment[WIP_COMMENT_FIELDS.FIELDS_TRANSACTION_KEY] = transKey; drComment[WIP_COMMENT_FIELDS.FIELDS_ENTERPRISE_KEY] = dr[POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY]; drComment[WIP_COMMENT_FIELDS.FIELDS_ROUTE_KEY] = dr[POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY]; drComment[WIP_COMMENT_FIELDS.FIELDS_STEP_KEY] = dr[POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY]; drComment[WIP_COMMENT_FIELDS.FIELDS_EDIT_TIMEZONE] = timezone; drComment[WIP_COMMENT_FIELDS.FIELDS_EDIT_TIME] = DBNull.Value; drComment[WIP_COMMENT_FIELDS.FIELDS_EDITOR] = this._model.UserName; StringBuilder beforeContent = new StringBuilder(); //新批次号不为空。 if (!string.IsNullOrEmpty(newLotNumber)) { if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_LOT_NUMBER)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_LOT_NUMBER, newLotNumber); afterContent.AppendFormat("批次号:{0};", newLotNumber); } beforeContent.AppendFormat("批次号:{0};", dr[POR_LOT_FIELDS.FIELD_LOT_NUMBER]); } //新产品ID号不为空 if (!string.IsNullOrEmpty(newProId)) { if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_PRO_ID)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_PRO_ID, newProId); afterContent.AppendFormat("产品ID号:{0};", newProId); } beforeContent.AppendFormat("产品ID号:{0};", dr[POR_LOT_FIELDS.FIELD_PRO_ID]); } //新的创建类别。 if (!string.IsNullOrEmpty(newCreateType)) { if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_CREATE_TYPE)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_CREATE_TYPE, newCreateType); afterContent.AppendFormat("创建类别:{0};", newCreateType); } beforeContent.AppendFormat("创建类别:{0};", dr[POR_LOT_FIELDS.FIELD_CREATE_TYPE]); } //新的批次类别。 if (!string.IsNullOrEmpty(newLotType)) { if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_LOT_TYPE)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_LOT_TYPE, newLotType); afterContent.AppendFormat("批次类别:{0};", newLotType); } beforeContent.AppendFormat("批次类别:{0};", dr[POR_LOT_FIELDS.FIELD_LOT_TYPE]); } //新的优先级。 if (!string.IsNullOrEmpty(newPriority)) { if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_PRIORITY)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_PRIORITY, newPriority); afterContent.AppendFormat("优先级:{0};", newPriority); } beforeContent.AppendFormat("优先级:{0};", dr[POR_LOT_FIELDS.FIELD_PRIORITY]); } //新的转换效率。 if (!string.IsNullOrEmpty(newEfficiency)) { if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_EFFICIENCY)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_EFFICIENCY, newEfficiency); afterContent.AppendFormat("转换效率:{0};", newEfficiency); } beforeContent.AppendFormat("转换效率:{0};", dr[POR_LOT_FIELDS.FIELD_EFFICIENCY]); } //新的硅片供应商。 if (!string.IsNullOrEmpty(newSiLot)) { if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_SI_LOT)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_SI_LOT, newSiLot); afterContent.AppendFormat("硅片供应商:{0};", newSiLot); } beforeContent.AppendFormat("硅片供应商:{0};", dr[POR_LOT_FIELDS.FIELD_SI_LOT]); } //新的工步主键。 if (!string.IsNullOrEmpty(newStepKey)) { if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY, newEnterpriseKey); afterContent.AppendFormat("工艺流程组:{0};", newEnterpriseName); } if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY, newRouteKey); afterContent.AppendFormat("工艺流程:{0};", newRouteName); } if (!htMaindata.ContainsKey(POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY)) { htMaindata.Add(POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY, newStepKey); afterContent.AppendFormat("工序:{0};", newStepName); } drComment[WIP_COMMENT_FIELDS.FIELDS_ENTERPRISE_KEY] = newEnterpriseKey; drComment[WIP_COMMENT_FIELDS.FIELDS_ROUTE_KEY] = newRouteKey; drComment[WIP_COMMENT_FIELDS.FIELDS_STEP_KEY] = newStepKey; beforeContent.AppendFormat("工艺流程组:{0};", dr[POR_ROUTE_ENTERPRISE_VER_FIELDS.FIELD_ENTERPRISE_NAME]); beforeContent.AppendFormat("工艺流程:{0};", dr[POR_ROUTE_ROUTE_VER_FIELDS.FIELD_ROUTE_NAME]); beforeContent.AppendFormat("工序:{0};", dr[POR_ROUTE_STEP_FIELDS.FIELD_ROUTE_STEP_NAME]); } drComment[WIP_COMMENT_FIELDS.FIELDS_BEFORE_CONTENT] = beforeContent; drComment[WIP_COMMENT_FIELDS.FIELDS_AFTER_CONTENT] = afterContent; } DataTable dtMaindata = CommonUtils.ParseToDataTable(htMaindata); dtMaindata.TableName = TRANS_TABLES.TABLE_MAIN_DATA; dsParams.Tables.Add(dtMaindata); dsParams.Tables.Add(dtTransaction); dsParams.Tables.Add(dtComment); //执行调整批次。 this._entity.LotAdjust(dsParams); if (!string.IsNullOrEmpty(this._entity.ErrorMsg)) { MessageService.ShowError(this._entity.ErrorMsg); } else { //this.tsbCancle_Click(sender, e); MessageService.ShowMessage("保存成功"); WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.CloseWindow(false); //重新打开批次创建视图。 LotOperationViewContent view = new LotOperationViewContent(this._model.OperationType); WorkbenchSingleton.Workbench.ShowView(view); } dsParams.Tables.Clear(); dtTransaction = null; dtComment = null; dsParams = null; }
/// <summary> /// 批次调整操作。 /// </summary> /// <remarks> /// 操作名称:<see cref="ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_ADJUST"/>。 /// </remarks> /// <param name="dsParams">包含批次调整信息的数据集对象。</param> /// <returns>包含结果数据的数据集对象。</returns> public DataSet LotAdjust(DataSet dsParams) { DataSet dsReturn = new DataSet(); DbConnection dbConn = null; DbTransaction dbTran = null; try { dbConn = db.CreateConnection(); dbConn.Open(); dbTran = dbConn.BeginTransaction(); //参数数据。 if (dsParams == null || !dsParams.Tables.Contains(TRANS_TABLES.TABLE_MAIN_DATA) || !dsParams.Tables.Contains(WIP_TRANSACTION_FIELDS.DATABASE_TABLE_NAME) || !dsParams.Tables.Contains(WIP_COMMENT_FIELDS.DATABASE_TABLE_NAME)) //存放操作数据 { dbTran.Rollback(); ReturnMessageUtils.AddServerReturnMessage(dsReturn, "传入参数不正确,请检查。"); return(dsReturn); } DataTable dtParams = dsParams.Tables[TRANS_TABLES.TABLE_MAIN_DATA]; //存放修改后批次数据 DataTable dtTransaction = dsParams.Tables[WIP_TRANSACTION_FIELDS.DATABASE_TABLE_NAME]; //存放操作数据 DataTable dtComment = dsParams.Tables[WIP_COMMENT_FIELDS.DATABASE_TABLE_NAME]; //存放批次调整明细数据 Hashtable htParams = CommonUtils.ConvertToHashtable(dtParams); //检查是否存在重复的批次主键。 var lnq = from item in dtTransaction.AsEnumerable() group item by item[WIP_TRANSACTION_FIELDS.FIELD_PIECE_KEY] into g where g.Count() > 1 select g.Count(); if (lnq.Count() > 0) { dbTran.Rollback(); ReturnMessageUtils.AddServerReturnMessage(dsReturn, "存在重复记录,请检查。"); return(dsReturn); } //检查记录是否过期。防止重复修改。 foreach (DataRow drTransaction in dtTransaction.Rows) { string opEditTime = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME]); //操作前批次编辑时间 string lotKey = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_PIECE_KEY]); //批次主键 string editor = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDITOR]); //编辑人 string timeZone = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDITOR]); //编辑时区 //检查记录是否过期。防止重复修改。 KeyValuePair <string, string> kvp = new KeyValuePair <string, string>(POR_LOT_FIELDS.FIELD_LOT_KEY, lotKey); List <KeyValuePair <string, string> > listCondition = new List <KeyValuePair <string, string> >(); listCondition.Add(kvp); //如果记录过期,当前编辑时间<数据库中的记录编辑时间。结束方法执行。 if (UtilHelper.CheckRecordExpired(db, POR_LOT_FIELDS.DATABASE_TABLE_NAME, listCondition, opEditTime)) { dbTran.Rollback(); ReturnMessageUtils.AddServerReturnMessage(dsReturn, "信息已过期,请关闭该界面后重试。"); return(dsReturn); } } //插入操作记录 foreach (DataRow drTransaction in dtTransaction.Rows) { if (Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY]) != ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_ADJUST) { throw new Exception("传入操作动作名称不正确,请检查。"); } string transactionKey = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_TRANSACTION_KEY]); string lotKey = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_PIECE_KEY]); //批次主键 string editor = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDITOR]); //编辑人 string timeZone = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDITOR]); //编辑时区 AddWIPLot(dbTran, transactionKey, lotKey); //向WIP_TRANSACTION表插入批次调整的操作记录。 WIP_TRANSACTION_FIELDS wipFields = new WIP_TRANSACTION_FIELDS(); drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME] = DBNull.Value; string sql = DatabaseTable.BuildInsertSqlStatement(wipFields, drTransaction, null); db.ExecuteNonQuery(dbTran, CommandType.Text, sql); //更新批次信息。 StringBuilder sbUpdateSql = new StringBuilder(); sbUpdateSql.AppendFormat("UPDATE POR_LOT SET EDITOR='{0}',EDIT_TIME=GETDATE(),EDIT_TIMEZONE='{1}'", editor.PreventSQLInjection(), timeZone.PreventSQLInjection()); if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_LOT_NUMBER)) { sbUpdateSql.AppendFormat(",LOT_NUMBER='{0}'", Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_LOT_NUMBER]).PreventSQLInjection()); } if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_PRO_ID)) { sbUpdateSql.AppendFormat(",PRO_ID='{0}'", Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_PRO_ID]).PreventSQLInjection()); } if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_CREATE_TYPE)) { sbUpdateSql.AppendFormat(",CREATE_TYPE='{0}'", Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_CREATE_TYPE]).PreventSQLInjection()); } if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_LOT_TYPE)) { sbUpdateSql.AppendFormat(",LOT_TYPE='{0}'", Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_LOT_TYPE]).PreventSQLInjection()); } if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_PRIORITY)) { sbUpdateSql.AppendFormat(",PRIORITY='{0}'", Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_PRIORITY]).PreventSQLInjection()); } if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_EFFICIENCY)) { sbUpdateSql.AppendFormat(",EFFICIENCY='{0}'", Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_EFFICIENCY]).PreventSQLInjection()); } if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_SI_LOT)) { sbUpdateSql.AppendFormat(",SI_LOT='{0}'", Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_SI_LOT]).PreventSQLInjection()); } if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY)) { sbUpdateSql.AppendFormat(",ROUTE_ENTERPRISE_VER_KEY='{0}'", Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY]).PreventSQLInjection()); } if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY)) { sbUpdateSql.AppendFormat(",CUR_ROUTE_VER_KEY='{0}'", Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY]).PreventSQLInjection()); } if (htParams.ContainsKey(POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY)) { string stepKey = Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY]); sbUpdateSql.AppendFormat(",CUR_STEP_VER_KEY='{0}',STATE_FLAG='{1}',START_WAIT_TIME=GETDATE()", stepKey.PreventSQLInjection(), 0); //更新批次状态为等待进站。 //更新设备数据,以完成设备出站,切换设备状态。 sql = string.Format(@"SELECT B.EQUIPMENT_KEY,A.EQUIPMENT_NAME,A.EQUIPMENT_STATE_KEY FROM EMS_EQUIPMENTS A,EMS_LOT_EQUIPMENT B WHERE A.EQUIPMENT_KEY = B.EQUIPMENT_KEY AND B.STEP_KEY = '{0}' AND B.LOT_KEY='{1}' AND B.END_TIMESTAMP IS NULL", stepKey.PreventSQLInjection(), lotKey.PreventSQLInjection()); DataSet dsResult = db.ExecuteDataSet(CommandType.Text, sql); if (dsResult != null && dsResult.Tables.Count > 0 && dsResult.Tables[0].Rows.Count > 0) { string equipmentKey = Convert.ToString(dsResult.Tables[0].Rows[0]["EQUIPMENT_KEY"]); WipManagement.TrackOutForEquipment(db, dbTran, lotKey, stepKey, equipmentKey, editor); } } sbUpdateSql.AppendFormat(" WHERE LOT_KEY='{0}'", lotKey.PreventSQLInjection()); db.ExecuteNonQuery(dbTran, CommandType.Text, sbUpdateSql.ToString()); } //插入批次调整明细记录 foreach (DataRow drComment in dtComment.Rows) { //向WIP_COMMENT表插入批次调整的操作记录。 WIP_COMMENT_FIELDS commentFields = new WIP_COMMENT_FIELDS(); string sql = DatabaseTable.BuildInsertSqlStatement(commentFields, drComment, null); db.ExecuteNonQuery(dbTran, CommandType.Text, sql); } dbTran.Commit(); ReturnMessageUtils.AddServerReturnMessage(dsReturn, string.Empty); } catch (Exception ex) { ReturnMessageUtils.AddServerReturnMessage(dsReturn, ex.Message); LogService.LogError("LotAdjust Error: " + ex.Message); dbTran.Rollback(); } finally { dbConn.Close(); } return(dsReturn); }
/// <summary> /// 返工/返修批次。 /// </summary> /// <param name="dsParams">包含批次返工/返修信息的数据集对象。</param> /// <param name="dbTran">数据库操作事务对象。</param> private void LotRework(DataSet dsParams, DbTransaction dbTran) { //参数数据。 if (dsParams == null || !dsParams.Tables.Contains(WIP_TRANSACTION_FIELDS.DATABASE_TABLE_NAME) || !dsParams.Tables.Contains(WIP_COMMENT_FIELDS.DATABASE_TABLE_NAME) || dsParams.Tables[WIP_TRANSACTION_FIELDS.DATABASE_TABLE_NAME].Rows.Count == 0 || //返工批次操作记录不能为空记录。 dsParams.Tables[WIP_COMMENT_FIELDS.DATABASE_TABLE_NAME].Rows.Count == 0) //返工信息不能为空 { throw new Exception("传入参数不正确,请检查。"); } DataTable dtTransaction = dsParams.Tables[WIP_TRANSACTION_FIELDS.DATABASE_TABLE_NAME]; //存放操作数据 DataTable dtComment = dsParams.Tables[WIP_COMMENT_FIELDS.DATABASE_TABLE_NAME]; //存放返工信息明细数据 DataTable dtParams = dsParams.Tables[TRANS_TABLES.TABLE_MAIN_DATA]; Hashtable htParams = CommonUtils.ConvertToHashtable(dtParams); string reworkEnterpriseKey = Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_ROUTE_ENTERPRISE_VER_KEY]); string reworkRouteKey = Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_CUR_ROUTE_VER_KEY]); string reworkStepKey = Convert.ToString(htParams[POR_LOT_FIELDS.FIELD_CUR_STEP_VER_KEY]); DataTable dtHold = null; if (dsParams.Tables.Contains(WIP_HOLD_RELEASE_FIELDS.DATABASE_TABLE_NAME) && dsParams.Tables[WIP_HOLD_RELEASE_FIELDS.DATABASE_TABLE_NAME].Rows.Count > 0) { dtHold = dsParams.Tables[WIP_HOLD_RELEASE_FIELDS.DATABASE_TABLE_NAME]; //存放暂停信息明细数据 } //插入操作记录 foreach (DataRow drTransaction in dtTransaction.Rows) { string lotKey = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_PIECE_KEY]); //批次主键 string editor = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDITOR]); //编辑人 string timeZone = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDITOR]); //编辑时区 string stepKey = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_STEP_KEY]); //当前工步主键 if (Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_ACTIVITY]) != ACTIVITY_FIELD_VALUES.FIELD_ACTIVITY_REWORK) { throw new Exception("传入的操作名称不正确,请检查。"); } string transactionKey = Convert.ToString(drTransaction[WIP_TRANSACTION_FIELDS.FIELD_TRANSACTION_KEY]); AddWIPLot(dbTran, transactionKey, lotKey); //向WIP_TRANSACTION表插入批次调整的操作记录。 WIP_TRANSACTION_FIELDS wipFields = new WIP_TRANSACTION_FIELDS(); drTransaction[WIP_TRANSACTION_FIELDS.FIELD_EDIT_TIME] = DBNull.Value; string sql = DatabaseTable.BuildInsertSqlStatement(wipFields, drTransaction, null); db.ExecuteNonQuery(dbTran, CommandType.Text, sql); //更新批次数据 StringBuilder sbUpdateSql = new StringBuilder(); sbUpdateSql.AppendFormat(@"UPDATE POR_LOT SET STATE_FLAG=0,START_WAIT_TIME=GETDATE(),REWORK_FLAG=REWORK_FLAG+1, ROUTE_ENTERPRISE_VER_KEY='{0}',CUR_ROUTE_VER_KEY='{1}',CUR_STEP_VER_KEY='{2}', EDITOR='{3}',EDIT_TIME=GETDATE(),EDIT_TIMEZONE='{4}'", reworkEnterpriseKey.PreventSQLInjection(), reworkRouteKey.PreventSQLInjection(), reworkStepKey.PreventSQLInjection(), editor.PreventSQLInjection(), timeZone.PreventSQLInjection()); //如果当前有HOLD批次,则释放批次。 if (dtHold != null) { sbUpdateSql.Append(",HOLD_FLAG=0"); } sbUpdateSql.AppendFormat(" WHERE LOT_KEY='{0}'", lotKey.PreventSQLInjection()); db.ExecuteNonQuery(dbTran, CommandType.Text, sbUpdateSql.ToString()); //更新设备数据,以完成设备出站,切换设备状态。 sql = string.Format(@"SELECT B.EQUIPMENT_KEY,A.EQUIPMENT_NAME,A.EQUIPMENT_STATE_KEY FROM EMS_EQUIPMENTS A,EMS_LOT_EQUIPMENT B WHERE A.EQUIPMENT_KEY = B.EQUIPMENT_KEY AND B.STEP_KEY = '{0}' AND B.LOT_KEY='{1}' AND B.END_TIMESTAMP IS NULL", stepKey.PreventSQLInjection(), lotKey.PreventSQLInjection()); DataSet dsResult = db.ExecuteDataSet(CommandType.Text, sql); if (dsResult != null && dsResult.Tables.Count > 0 && dsResult.Tables[0].Rows.Count > 0) { string equipmentKey = Convert.ToString(dsResult.Tables[0].Rows[0]["EQUIPMENT_KEY"]); WipManagement.TrackOutForEquipment(db, dbTran, lotKey, stepKey, equipmentKey, editor); } } //插入批次返工明细记录 foreach (DataRow drComment in dtComment.Rows) { //向WIP_COMMENT表插入批次调整的操作记录。 WIP_COMMENT_FIELDS commentFields = new WIP_COMMENT_FIELDS(); string sql = DatabaseTable.BuildInsertSqlStatement(commentFields, drComment, null); db.ExecuteNonQuery(dbTran, CommandType.Text, sql); } }