Пример #1
0
        private void Doit()
        {
            while (isRun)
            {
                DateTime dtNow = DateTime.Now;
                DateTime m__dtBegin = new DateTime();
                DateTime dtNull = new DateTime();
                if (dtNow.Hour == 7 && (dtNow.Minute > 45 && dtNow.Minute < 50))
                {
                    m__dtBegin = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, dtNow.Hour, 0, 0);
                    dtNull = new DateTime(dtNow.AddDays(-1).Year, dtNow.AddDays(-1).Month, dtNow.AddDays(-1).Day, 19, 0, 0);
                }
                else if (dtNow.Hour == 19 && (dtNow.Minute > 45 && dtNow.Minute < 50))
                {
                    m__dtBegin = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, dtNow.Hour, 0, 0);
                    dtNull = new DateTime(dtNow.Year, dtNow.Month, dtNow.Day, 7, 0, 0);
                }
                else
                {
                    Thread.Sleep(10000);
                    continue;
                }

                Dictionary<int, DateTime> dic_time = new Dictionary<int, DateTime>();
                foreach (Line line in GlobalVars.lines)
                {
                    DateTime dtCurrentTime = m__dtBegin;

                    List<ScheduleDownTime> lstScheduleDowntime = new List<ScheduleDownTime>(); //所有的计划停机
                    List<UnScheduleDownTime> lstUnscheDowntime = new List<UnScheduleDownTime>();//所有的非计划停机

                    List<FlowDowntime> lstFlowDowntime = new List<FlowDowntime>();//所有的停机事件
                    List<FlowProduction> lstFlowProduction = new List<FlowProduction>(); //所有的生产事件

                    List<Station> lstStation = new List<Station>();
                    lstStation = DALLib<Station>.DataAccess.GetSome(string.Format("select * from tbDic_Station where LineId={0}", line.Id));

                    //获取最后一次的纪录停机时间
                    FlowProduction flowproduction = DALLib<FlowProduction>.DataAccess.GetOneBySQL(string.Format("select top 1  * from tbFlowProduction where LineId={0}  order by RealStartTime desc ", line.Id));
                    if (flowproduction == null)
                    {
                        flowproduction = new FlowProduction();
                        //flowproduction.RealEndTime = DateTime.Now.AddHours(-12);
                        flowproduction.RealEndTime = dtNull;
                    }
                    GlobalVars.LastFlowProduction = flowproduction;
                    if (dic_time.ContainsKey(line.Id))
                    {
                        dic_time[line.Id] = flowproduction.RealEndTime;
                    }
                    else
                    {
                        dic_time.Add(line.Id, flowproduction.RealEndTime);
                    }

                    //lstScheduleDowntime = queryhelper.QueryScheduleDowntime(line, flowproduction.RealEndTime, dtCurrentTime);
                    //lstUnscheDowntime = queryhelper.QueryUnScheduleDowntime(line, flowproduction.RealEndTime, dtCurrentTime);

                    DataTable IsSplitedTab = new DataTable();
                    FlowProduction lastFlowProduction;
                    if (GlobalVars.dicIsUndoneFlowProduction != null && GlobalVars.dicIsUndoneFlowProduction.TryGetValue(line.Id, out lastFlowProduction) && lastFlowProduction != null)
                    {
                        string SqlDeleteFlowProduction = "DELETE FROM tbFlowProduction WHERE LineId=" + line.Id + " AND RealStartTime>='" + lastFlowProduction.RealEndTime + "' AND RealStartTime<='" + dtCurrentTime + "'";
                        DALLib<object>.DataAccess.ExecuteNonQuery(SqlDeleteFlowProduction);
                        GlobalVars.dicIsUndoneFlowProduction.Remove(line.Id);
                        IsSplitedTab = dtsLogic.GetDownTime(line.Id, lastFlowProduction.RealEndTime, dtCurrentTime, out lstScheduleDowntime, out  lstUnscheDowntime);
                    }
                    else
                        IsSplitedTab = dtsLogic.GetDownTime(line.Id, flowproduction.RealEndTime, dtCurrentTime, out lstScheduleDowntime, out  lstUnscheDowntime);

                    DataTable dtResult = new DataTable();
                    dtResult.Columns.Add("Id", typeof(Int32));
                    dtResult.Columns.Add("dtStart", typeof(DateTime));
                    dtResult.Columns.Add("dtEnd", typeof(DateTime));
                    dtResult.Columns.Add("dtype", typeof(String));

                    for (int i = 0; i < lstScheduleDowntime.Count; i++)
                    {
                        DataRow row = dtResult.NewRow();
                        row["Id"] = lstScheduleDowntime[i].Id;
                        row["dtStart"] = lstScheduleDowntime[i].StartTime;
                        row["dtEnd"] = lstScheduleDowntime[i].EndTime;
                        row["dtype"] = "p";
                        dtResult.Rows.Add(row);
                    }

                    for (int i = 0; i < lstUnscheDowntime.Count; i++)
                    {
                        DataRow row = dtResult.NewRow();
                        row["Id"] = lstUnscheDowntime[i].Id;
                        row["dtStart"] = lstUnscheDowntime[i].StartTime;
                        row["dtEnd"] = lstUnscheDowntime[i].EndTime;
                        row["dtype"] = "u";
                        dtResult.Rows.Add(row);
                    }

                    DataRow[] sortedrows = dtResult.Select("", "dtStart asc");

                    #region 注释预留
                    //DateTime dtLastStart = DateTime.Now;
                    //DateTime dtLastEnd = DateTime.Now;
                    //DateTime dtCurrentStart = DateTime.Now;
                    //DateTime dtCurrentEnd = DateTime.Now;

                    //for (int i = 0; i < sortedrows.Length; i++)
                    //{
                    //    if (i == 0)
                    //    {
                    //        dtLastStart = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(sortedrows[i]["dtStart"]);
                    //        dtLastEnd = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(sortedrows[i]["dtEnd"]);
                    //        continue;
                    //    }

                    //    dtCurrentStart = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(sortedrows[i]["dtStart"]);
                    //    dtCurrentEnd = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(sortedrows[i]["dtEnd"]);

                    //    if (dtCurrentStart > dtLastEnd) //本次开始时间大于上次结束时间
                    //    {
                    //        dtLastStart = dtCurrentStart;
                    //        dtLastEnd = dtCurrentEnd;
                    //        continue;
                    //    }
                    //    if (dtCurrentStart < dtLastEnd)
                    //    {
                    //        if (dtCurrentEnd < dtLastEnd)
                    //        {
                    //            sortedrows[i]["Id"] = 0;
                    //            dtLastStart = dtCurrentEnd;
                    //        }
                    //        else
                    //        {
                    //            sortedrows[i]["dtStart"] = dtLastEnd;
                    //            dtLastStart = dtLastEnd;
                    //            dtLastEnd = dtCurrentEnd;
                    //        }
                    //    }
                    //}
                    #endregion

                    DataTable _dtResultTable = dtResult.Clone();

                    #region 存储FlowDownTime内容
                    for (int i = 0; i < sortedrows.Length; i++)
                    {
                        int DowntimeId = DMES.Utility.CommonMethod.SafeGetIntFromObj(sortedrows[i]["Id"], 0);
                        DateTime dtStart = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(sortedrows[i]["dtStart"]);
                        DateTime dtEnd = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(sortedrows[i]["dtEnd"]);

                        if (dtEnd <= new DateTime(1901, 1, 1, 0, 0, 0))
                        {
                            dtEnd = DateTime.Now;
                            sortedrows[i]["dtEnd"] = dtEnd;
                        }
                        string dtye = DMES.Utility.CommonMethod.SafeGetStringFromObj(sortedrows[i]["dtype"]);

                        if (DowntimeId == 0)
                        {
                            continue;
                        }
                        FlowDowntime _flowdowntime = new FlowDowntime();

                        if (dtye == "p")
                        {
                            _flowdowntime.DowntimeType = "p";
                            _flowdowntime.StartTime = dtStart;
                            _flowdowntime.EndTime = dtEnd;
                            _flowdowntime.LineId = line.Id;

                            double span = _flowdowntime.EndTime.Subtract(_flowdowntime.StartTime).TotalMinutes;
                            _flowdowntime.PlandDowntimeSpan = DMES.Utility.CommonMethod.SafeGetDecimalFromObject(span, 0);
                            _flowdowntime.LineName = line.LineName;
                            ScheduleDownTime sd = lstScheduleDowntime.Find(p => p.Id == DowntimeId);

                            ScheduleDownType sdtype = DALLib<ScheduleDownType>.DataAccess.GetOne("Id", sd.ScheduleDownTypeId);
                            Station station = lstStation.Find(p => p.Id == sd.StationId);
                            _flowdowntime.DowntimeStationId = sd.StationId;
                            _flowdowntime.DowntimeStation = station.StationCode;
                        }
                        else if (dtye == "u")
                        {
                            _flowdowntime.DowntimeType = "u";
                            _flowdowntime.StartTime = dtStart;
                            _flowdowntime.EndTime = dtEnd;
                            _flowdowntime.LineId = line.Id;
                            _flowdowntime.LineName = line.LineName;
                            UnScheduleDownTime ud = lstUnscheDowntime.Find(p => p.Id == DowntimeId);
                            DefectCategory defect = DALLib<DefectCategory>.DataAccess.GetOne("Id", ud.DefectCategoryId);
                            Station station = lstStation.Find(p => p.Id == ud.StationId);
                            _flowdowntime.DowntimeStationId = station.Id;
                            double span = _flowdowntime.EndTime.Subtract(_flowdowntime.StartTime).TotalMinutes;
                            _flowdowntime.UnPlandDowntimeSpan = DMES.Utility.CommonMethod.SafeGetDecimalFromObject(span, 0);
                            _flowdowntime.DowntimeStation = station.StationCode;
                        }
                        lstFlowDowntime.Add(_flowdowntime);
                        _dtResultTable.ImportRow(sortedrows[i]);
                    }

                    foreach (FlowDowntime dttime in lstFlowDowntime)
                    {
                        DALLib<FlowDowntime>.DataAccess.SaveOne(dttime);
                    }
                    #endregion

                    #region 存储FlowProduction内容
                    FlowProduction LastOneProduction = null;
                    for (int i = 0; i < IsSplitedTab.Rows.Count; i++)
                    {
                        int DowntimeId = DMES.Utility.CommonMethod.SafeGetIntFromObj(IsSplitedTab.Rows[i]["id"], 0);

                        DateTime dtStart = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(IsSplitedTab.Rows[i]["starttime"]);
                        DateTime dtEnd = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(IsSplitedTab.Rows[i]["endtime"]);
                        string dtye = DMES.Utility.CommonMethod.SafeGetStringFromObj(IsSplitedTab.Rows[i]["downcode"]);

                        FlowProduction currentproduction = new FlowProduction();
                        currentproduction.RealStartTime = dtStart;
                        currentproduction.RealEndTime = dtEnd;
                        currentproduction.LineId = line.Id;

                        if (dtye.Contains("P"))
                        {
                            ScheduleDownTime sd = lstScheduleDowntime.Find(p => p.Id == DowntimeId);
                            ScheduleDownType scheduletype = DALLib<ScheduleDownType>.DataAccess.GetOne("Id", sd.ScheduleDownTypeId);
                            Station station = lstStation.Find(p => p.Id == sd.StationId);
                            currentproduction.PlanedDownTimeCode = scheduletype.ScheduleDownTypeName;
                            currentproduction.PlanedDowntimeDesc = scheduletype.ClientDisplay;
                            currentproduction.PlanedDownTimeID = scheduletype.Id;
                            currentproduction.Person = "P";
                            currentproduction.PlanedDowntimeSpan = DMES.Utility.CommonMethod.SafeGetDecimalFromObject(dtEnd.Subtract(dtStart).TotalMinutes, 4);
                            currentproduction.ProductOutput = 0;
                            currentproduction.ProductionOEE = 0;
                            currentproduction.DownTimeStationId = station.Id;
                            currentproduction.DownTimeStation = station.StationCode;
                            currentproduction.LineId = line.Id;
                        }
                        else if (dtye.Contains("U"))
                        {
                            UnScheduleDownTime ud = lstUnscheDowntime.Find(p => p.Id == DowntimeId);
                            DefectCategory defect = DALLib<DefectCategory>.DataAccess.GetOne("Id", ud.DefectCategoryId);
                            Station station = lstStation.Find(p => p.Id == ud.StationId);
                            currentproduction.Person = "U";
                            currentproduction.UnplanDowntimeId = ud.Id;
                            currentproduction.UnplanedDowntimeDesc = defect.ClientDisplay;
                            currentproduction.UnplanDowntimeCode = defect.DefectCategoryName;
                            currentproduction.UnplanedDowntimeSpan = DMES.Utility.CommonMethod.SafeGetDecimalFromObject(dtEnd.Subtract(dtStart).TotalMinutes, 4);
                            currentproduction.DownTimeStation = station.StationCode;
                            currentproduction.DownTimeStationId = station.Id;
                            currentproduction.LineId = line.Id;
                        }
                        else if (dtye.Contains("product"))
                        {
                            //写入一条产量纪录
                            currentproduction.Person = "product";
                            currentproduction.RealProductTime = CommonMethod.SafeGetDecimalFromObject(dtEnd.Subtract(dtStart).TotalMinutes, 4);
                            lstFlowProduction.Add(currentproduction);
                        }
                        LastOneProduction = currentproduction;

                        lstFlowProduction.Add(currentproduction);
                    }

                    for (int i = 0; i < lstFlowProduction.Count; i++)
                    {
                        #region
                        //lstFlowProduction[i].LineId = line.Id;

                        //DateTime _dtBegin = lstFlowProduction[i].RealStartTime;
                        //DateTime _dtEnd = lstFlowProduction[i].RealEndTime;

                        //if (_dtBegin.Hour != _dtEnd.Hour)
                        //{
                        //    int hous = _dtEnd.Hour - _dtBegin.Hour;
                        //    DateTime _dtStarttime = _dtBegin;

                        //    if (hous < 0)
                        //    {
                        //        hous += 24;
                        //    }

                        //    for (int j = 0; j <= hous; j++)
                        //    {
                        //        DateTime dttempEnd = new DateTime(_dtStarttime.AddHours(1).Year, _dtStarttime.AddHours(1).Month,
                        //            _dtStarttime.AddHours(1).Day, _dtStarttime.AddHours(1).Hour, 0, 0);
                        //        if (dttempEnd >= _dtEnd)
                        //        {
                        //            dttempEnd = _dtEnd;
                        //        }

                        //        FlowProduction t_production = lstFlowProduction[i];
                        //        t_production.Id = 0;
                        //        t_production.RealStartTime = _dtStarttime;
                        //        t_production.RealEndTime = dttempEnd;
                        //        _dtStarttime = dttempEnd;
                        //        if (t_production.Person == "P")
                        //        {
                        //            t_production.PlanedDowntimeSpan = Math.Round(DMES.Utility.CommonMethod.SafeGetDecimalFromObject(t_production.RealEndTime.Subtract(t_production.RealStartTime).TotalMinutes, 0), 4);
                        //        }
                        //        else if (t_production.Person == "U")
                        //        {
                        //            t_production.UnplanedDowntimeSpan = Math.Round(DMES.Utility.CommonMethod.SafeGetDecimalFromObject(t_production.RealEndTime.Subtract(t_production.RealStartTime).TotalMinutes, 0), 4);
                        //        }
                        //        DALLib<FlowProduction>.DataAccess.SaveOne(t_production);
                        //    }
                        //    continue;
                        //}
                        #endregion
                        DALLib<FlowProduction>.DataAccess.SaveOne(lstFlowProduction[i]);
                    }
                    #endregion
                }

                #region 把这个时间内的产量纪录替换成为真正的产量纪录,里面可能包含换型。
                //foreach (Line line in GlobalVars.lines)
                //{

                //    DateTime dtCurrentTime = m__dtBegin;

                //    //string sqlflowproducts = @"select * from [dbo].[tbFlowProduction] where LineId={2}
                //    //and RealStartTime between '{0}' and  '{1}'
                //    //and Person='product' order by  RealStartTime asc ";
                //    sqlflowproducts = string.Format(sqlflowproducts, dic_time[line.Id], dtCurrentTime, line.Id);

                //    List<FlowProduction> lstWaitSpitProution = DALLib<FlowProduction>.DataAccess.GetSome(sqlflowproducts);
                //    if (lstWaitSpitProution == null)
                //    {
                //        lstWaitSpitProution = new List<FlowProduction>();
                //    }

                //    //获取上次最后一条产量纪录
                //    //string sqllast_productime = @"SELECT top 1  *
                //    //      FROM [dbo].[tbFlowProduction]
                //    //      where Person='product' and LineId={0} order by RealStartTime desc ";

                //    sqllast_productime = string.Format(sqllast_productime, line.Id);

                //    FlowProduction production = DALLib<FlowProduction>.DataAccess.GetOneBySQL(sqllast_productime);
                //    DateTime dt_last = DateTime.MinValue;
                //    if (production != null)
                //    {
                //        dt_last = production.RealEndTime;
                //    }

                //    for (int i = 0; i < lstWaitSpitProution.Count; i++)
                //    {
                //        string stationlocations = reporthelper.GetStationLocations(line.Id);
                //        //MesFactory.GetInstance().DoProduction(lstWaitSpitProution[i].RealStartTime, lstWaitSpitProution[i].RealEndTime, line.Id, line.LineName);
                //    }

                //    for (int i = 0; i < lstWaitSpitProution.Count; i++)
                //    {
                //        DALLib<FlowProduction>.DataAccess.DeleteOne(lstWaitSpitProution[i].Id);
                //        Thread.Sleep(10);
                //    }
                //}
                #endregion

                //查看下当前时间,如果为19:30 、7:30
                Thread.Sleep(1000 * 60 * 5);
                //Thread.Sleep(10000);

            }
        }
Пример #2
0
        public static void AnalyzeDatatable(DataTable dtProduct, int lineid, string lineName, DateTime p_dtStart, DateTime p_dtEnd, int spiltcount, string spiltname)
        {
            //在这里会把数据写入到更新的system表中。

            //计算一个时间段内的数据。

            List<FlowProduction> lstFlowProduction = new List<FlowProduction>();
            List<FlowDowntime> lstDowntime = new List<FlowDowntime>();
            if (dtProduct == null)
            {
                dtProduct = new DataTable();
            }

            FlowProduction m_production = new FlowProduction();

            DateTime dtStart = p_dtStart;
            DateTime dtEnd = p_dtEnd;

            string lastproductname = "";
            int output = spiltcount;
            for (int i = 0; i < dtProduct.Rows.Count; i++)
            {
                string temp = lastproductname = DMES.Utility.CommonMethod.SafeGetStringFromObj(dtProduct.Rows[i]["type_number"]);
                DateTime dt__end = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(dtProduct.Rows[i]["createtime"]);

                if (i == 0)
                {
                    //找出最后一条纪录的时间
                    string sqllastoutput = "select top 1 * from tbFlowProduction where LineId={0} and RealStartTime>'{1}'  order by RealStartTime asc ";
                    sqllastoutput = string.Format(sqllastoutput, lineid, dtStart);
                    FlowProduction __flowproduction = DALLib<FlowProduction>.DataAccess.GetOneBySQL(sqllastoutput);
                    if (__flowproduction != null)
                    {

                        if (!String.IsNullOrEmpty(spiltname) && spiltname != temp)
                        {

                            if (__flowproduction.RealEndTime < dt__end)
                            {
                                //写入一条换型纪录

                                WriteOneU6Record(spiltname, temp, __flowproduction.RealEndTime, dt__end, lineid, lineName);
                                dtStart = dt__end;

                            }
                        }

                    }
                }

                if (lastproductname == "")
                {
                    lastproductname = temp;
                }

                if (lastproductname == temp)
                {
                    output++;
                }
                else
                {
                    DateTime dt__last = DMES.Utility.CommonMethod.SafeGetDateTimeFromObj(dtProduct.Rows[i - 1]["createtime"]);
                    WriteOneProductTime(lastproductname, dtStart, dt__last, output, lineid, lineName);
                    WriteOneU6Record(lastproductname, temp, dt__last, dt__end, lineid, lineName);
                    dtStart = dt__end;
                    output = 1;
                }
                lastproductname = temp;
            }

            if (dtProduct.Rows.Count > 0)
            {
                //写入最后一条纪录

                WriteOneProductTime(lastproductname, dtStart, dtEnd, output, lineid, lineName);
            }
        }
Пример #3
0
        private static void WriteOneU6Record(string productname, string tempproduct, DateTime dtEnd, DateTime dtTemp, int lineId, string lineName)
        {
            FlowDowntime m_downtime = new FlowDowntime();
            m_downtime.DowntimeCode = "U6";
            m_downtime.DowntimeType = "U";
            m_downtime.StartTime = dtEnd;
            m_downtime.EndTime = dtTemp;
            m_downtime.UnPlandDowntimeSpan = DMES.Utility.CommonMethod.SafeGetDecimalFromObject(
                m_downtime.EndTime.Subtract(m_downtime.StartTime).TotalMinutes, 0);

            m_downtime.LineName = lineName;
            m_downtime.LineId = lineId;
            DALLib<FlowDowntime>.DataAccess.SaveOne(m_downtime);

            FlowProduction flowproduction = new FlowProduction();
            flowproduction.RealEndTime = m_downtime.EndTime;
            flowproduction.RealStartTime = m_downtime.StartTime;
            flowproduction.UnplanDowntimeCode = "U6";
            flowproduction.UnplanedDowntimeSpan = m_downtime.UnPlandDowntimeSpan;
            flowproduction.Person = "changeover";
            DALLib<FlowProduction>.DataAccess.SaveOne(flowproduction);
        }
Пример #4
0
        private static void WriteOneProductTime(string productname, DateTime dtStart, DateTime dtEnd, int output, int lineId, string lineName)
        {
            FlowProduction m_production = new FlowProduction();
            m_production.ProductName = productname;
            m_production.RealStartTime = dtStart;
            m_production.RealEndTime = dtEnd;
            m_production.ProductOutput = output;
            m_production.Person = "output";
            //接下来一些算CT之类的加上来。
            m_production.LineId = lineId;

            //查找CT
            string sqlct = @" select [tbDic_Product_Line_CT].*  from [dbo].[tbDic_Product]
                     inner join
                    [dbo].[tbDic_Product_Line_CT] on [tbDic_Product].Id=[tbDic_Product_Line_CT].ProductId
                    where LineId={0} and [tbDic_Product].PCBA='{1}'";

            sqlct = string.Format(sqlct, lineId, m_production.ProductName);

            Product_Line_CT linct = DALLib<Product_Line_CT>.DataAccess.GetOneBySQL(sqlct);
            if (linct == null)
            {
                linct = new Product_Line_CT();
            }

            decimal d_linect = DMES.Utility.CommonMethod.SafeGetDecimalFromObject(linct.CycleTime, 0);
            if (d_linect <= 0)
            {
                d_linect = 11;
            }

            m_production.PlanedCT = d_linect;
            decimal span_s = DMES.Utility.CommonMethod.SafeGetDecimalFromObject(m_production.RealEndTime.Subtract(m_production.RealStartTime).TotalMinutes, 0);

            m_production.RealProductTime = span_s;

            DALLib<FlowProduction>.DataAccess.SaveOne(m_production);
        }