/// <summary>
        /// 显示预警信息
        /// </summary>
        private void ShowAlertMessage(MachineFeeder machineFeeder, object alertObj)
        {
            DBDateTime dbDateTime = FormatHelper.GetNowDBDateTime(this.DataProvider);
            string     strMsg     = ">> $MachineCode = " + machineFeeder.MachineCode + " $MachineStationCode = " + machineFeeder.MachineStationCode;

            if (alertObj is Feeder)
            {
                Feeder   feeder    = (Feeder)alertObj;
                DateTime dateNow   = FormatHelper.ToDateTime(dbDateTime.DBDate, dbDateTime.DBTime);
                DateTime mDate     = FormatHelper.ToDateTime(Convert.ToInt32(feeder.TheMaintainDate), 000001);
                int      alterDate = dateNow.Subtract(mDate).Days; //算法是now减去保养日期

                strMsg += " $FeederCode = " + feeder.FeederCode + " $FeederMaxCount = " + feeder.MaxCount.ToString() + " $FeederAlertCount = " + feeder.AlertCount.ToString() + " $FeederUsedCount = " + feeder.UsedCount.ToString() +
                          " $MaxMaintainDate = " + feeder.MaxMDay + " $AlterDate = " + feeder.AlterMDay + " $UsedDate = " + alterDate;
            }
            else
            {
                ReelQty reel = (ReelQty)alertObj;
                strMsg += " $ReelNo = " + reel.ReelNo + " $ReelQty = " + reel.Qty.ToString() + " $ReelUsedQty = " + (reel.UsedQty + reel.UpdatedQty).ToString();
            }
            this.ucMessage.Add(new UserControl.Message(MessageType.Error, strMsg));
        }
        /// <summary>
        /// 添加停线信息
        /// </summary>
        private void AddLineError(ReelQty reel, string reelLeftQty)
        {
            DataRow[] rows = tableLineError.Select("LineCode='" + reel.StepSequenceCode + "' AND MachineCode='" + reel.MachineCode + "' AND MachineStationCode='" + reel.MachineStationCode + "'");
            DataRow   row  = tableLineError.NewRow();

            if (rows != null && rows.Length > 0)
            {
                row = rows[0];
            }
            row["LineCode"]           = reel.StepSequenceCode;
            row["MOCode"]             = reel.MOCode;
            row["ErrorType"]          = UserControl.MutiLanguages.ParserString("$SMT_LineError_Reel_Exhaust");
            row["MachineCode"]        = reel.MachineCode;
            row["MachineStationCode"] = reel.MachineStationCode;
            row["ReelNo"]             = reel.ReelNo;
            row["ReelLeftQty"]        = reelLeftQty;
            if (rows == null || rows.Length == 0)
            {
                tableLineError.Rows.Add(row);
                // Removed by Icye r2006/12/30	由于Loading比较大,暂时不记录Log
                //smtFacade.AddStopLineLog(reel, SMTLoadFeederOperationType.ReelExhaust, Service.ApplicationService.Current().UserCode);
            }
        }
        private void RefreshData()
        {
            if (bInRefresh == true)
            {
                return;
            }
            bInRefresh = true;
            //Icyer,2007/01/15 修改	减少Open/Close的次数
            ((BenQGuru.eMES.Common.DomainDataProvider.SQLDomainDataProvider)DataProvider).PersistBroker.AutoCloseConnection = false;
            ((BenQGuru.eMES.Common.DomainDataProvider.SQLDomainDataProvider)DataProvider).PersistBroker.OpenConnection();
            try
            {
                tableLineError.Rows.Clear();
                // 查询上料记录
                object[] machineFeederListTmp = smtFacade.LoadMachineFeederByLineMachine(this.txtLineCode.Value, string.Empty);
                if (machineFeederListTmp == null || machineFeederListTmp.Length == 0)
                {
                    //ApplicationRun.GetInfoForm().Add(new UserControl.Message(MessageType.Error, "$Cannot_Find_MachineFeeder_In_Watch"));
                    tableSource.Rows.Clear();
                    // 更新产线状态
                    RefreshLineStatusForMO();
                    // 控制产线
                    ControlLine();
                    return;
                }
                machineFeederList = new MachineFeeder[machineFeederListTmp.Length];
                machineFeederListTmp.CopyTo(machineFeederList, 0);
                // 是否需要更新上料记录
                bool bNeedUpdateSource = false;
                if (machineFeederList.Length != tableSource.Rows.Count) // 有单独上料或下料时
                {
                    bNeedUpdateSource = true;
                }
                else
                {
                    if (htMachineFeederList == null || htMachineFeederList.Count != machineFeederList.Length)
                    {
                        bNeedUpdateSource = true;
                    }
                    else
                    {
                        for (int i = 0; i < machineFeederList.Length; i++)
                        {
                            string strKey = machineFeederList[i].MachineCode + "'" + machineFeederList[i].MachineStationCode + "'" + machineFeederList[i].FeederCode + "'" + machineFeederList[i].ReelNo + "'" + machineFeederList[i].NextReelNo;
                            if (htMachineFeederList.Contains(strKey) == false)
                            {
                                bNeedUpdateSource = true;
                            }
                        }
                    }
                }
                if (bNeedUpdateSource == true)
                {
                    htMachineFeederList = new ArrayList();
                    for (int i = 0; i < machineFeederList.Length; i++)
                    {
                        string strKey = machineFeederList[i].MachineCode + "'" + machineFeederList[i].MachineStationCode + "'" + machineFeederList[i].FeederCode + "'" + machineFeederList[i].ReelNo + "'" + machineFeederList[i].NextReelNo;
                        if (htMachineFeederList.Contains(strKey) == false)
                        {
                            htMachineFeederList.Add(strKey);
                        }
                    }
                }
                // 更新上料记录
                if (bNeedUpdateSource == true)
                {
                    tableSource.Rows.Clear();
                    for (int i = 0; i < machineFeederList.Length; i++)
                    {
                        DataRow row = tableSource.NewRow();
                        row["LineCode"]           = machineFeederList[i].StepSequenceCode;
                        row["MachineCode"]        = machineFeederList[i].MachineCode;
                        row["MachineStationCode"] = machineFeederList[i].MachineStationCode;
                        row["FeederCode"]         = machineFeederList[i].FeederCode;
                        row["ReelNo"]             = machineFeederList[i].ReelNo;
                        row["IsAlert"]            = false;
                        row["NextReelNo"]         = machineFeederList[i].NextReelNo;
                        row["MoCode"]             = machineFeederList[i].MOCode;
                        tableSource.Rows.Add(row);
                    }
                }
                ArrayList listAlertFeeder = new ArrayList();
                ArrayList listAlertReel   = new ArrayList();
                // 更新Feeder次数和预警日期
                object[]   objsFeeder = smtFacade.LoadFeederByLineMachine(this.txtLineCode.Value, string.Empty);
                DBDateTime dbDateTime = FormatHelper.GetNowDBDateTime(this.DataProvider);
                if (objsFeeder != null)
                {
                    for (int i = 0; i < objsFeeder.Length; i++)
                    {
                        Feeder    feeder = (Feeder)objsFeeder[i];
                        DataRow[] rows   = tableSource.Select("FeederCode='" + feeder.FeederCode + "'");
                        if (rows != null && rows.Length > 0)
                        {
                            DateTime dateNow   = FormatHelper.ToDateTime(dbDateTime.DBDate, dbDateTime.DBTime);
                            DateTime mDate     = FormatHelper.ToDateTime(Convert.ToInt32(feeder.TheMaintainDate), 000001);
                            int      alterDate = dateNow.Subtract(mDate).Days; //算法是now减去保养日期

                            rows[0]["FeederLeftCount"] = feeder.MaxCount - feeder.UsedCount;
                            rows[0]["FeederAlterDay"]  = alterDate == 0 ? feeder.MaxMDay : feeder.MaxMDay - alterDate;
                            if (feeder.UsedCount >= feeder.AlertCount || alterDate > feeder.AlterMDay)
                            {
                                listAlertFeeder.Add(feeder);
                                rows[0]["IsAlert"] = true;
                            }
                        }
                    }
                }
                // 更新料卷用量
                object[] objsReel = smtFacade.LoadReelQtyByLineMachine(this.txtLineCode.Value, string.Empty);
                if (objsReel != null)
                {
                    for (int i = 0; i < objsReel.Length; i++)
                    {
                        ReelQty   reel = (ReelQty)objsReel[i];
                        DataRow[] rows = tableSource.Select("ReelNo='" + reel.ReelNo + "'");
                        if (rows != null && rows.Length > 0)
                        {
                            rows[0]["ReelLeftQty"] = reel.Qty - reel.UpdatedQty - reel.UsedQty;
                            if (reel.UpdatedQty + reel.UsedQty >= reel.Qty * this.ReelAlert &&
                                rows[0]["NextReelNo"].ToString() == string.Empty)
                            {
                                listAlertReel.Add(reel);
                                rows[0]["IsAlert"] = true;
                            }
                            if (reel.UpdatedQty + reel.UsedQty >= reel.Qty * this.ReelStopLine &&
                                rows[0]["NextReelNo"].ToString() == string.Empty)
                            {
                                this.AddLineError(reel, rows[0]["ReelLeftQty"].ToString());
                            }

                            ReelQty nextReelQty = (ReelQty)smtFacade.GetReelQty(rows[0]["NextReelNo"].ToString(), rows[0]["MoCode"].ToString());
                            if (nextReelQty != null)
                            {
                                rows[0]["NextReelLeftQty"] = nextReelQty.Qty - nextReelQty.UpdatedQty - nextReelQty.UsedQty;
                            }
                        }
                    }
                }
                // 更新预警消息
                //Application.DoEvents();
                for (int i = 0; i < this.gridList.Rows.Count; i++)
                {
                    if (Convert.ToBoolean(this.gridList.Rows[i].Cells["IsAlert"].Value) == true)
                    {
                        this.gridList.Rows[i].Appearance.ForeColor = Color.Red;
                    }
                }


                UpdateAlert(listAlertFeeder, listAlertReel);

                // 更新产线状态
                RefreshLineStatusForMO();
                // 控制产线
                ControlLine();
            }
            catch (Exception ex)
            {
                string strErrorInfo = System.DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss") + "\t" + ex.Message + "\t" + ex.Source;
                strErrorInfo += "\r\n" + ex.StackTrace;
                UserControl.FileLog.FileLogOut("Client.log", strErrorInfo);
            }
            finally
            {
                bInRefresh = false;
                ((BenQGuru.eMES.Common.DomainDataProvider.SQLDomainDataProvider)DataProvider).PersistBroker.CloseConnection();
                ((BenQGuru.eMES.Common.DomainDataProvider.SQLDomainDataProvider)DataProvider).PersistBroker.AutoCloseConnection = true;
            }
        }