private void SetForcastEntities()
        {
            var ForecastList = ForecastCatcher.entities.EntityList.Where(w => w.Ope_NO.CompareTo(curFlow.Ope_NO) > 0);

            foreach (var cast in ForecastList)
            {
                ReqRpt048Stage2Entity entity = new ReqRpt048Stage2Entity();
                entity.OpeNO      = cast.Ope_NO;
                entity.Department = cast.Department;
                entity.EqpType    = cast.Eqp_Type;
                entity.ModulePD   = cast.ModulePD_ID;
                var pd = PDCatcher.entities.EntityList.Where(w => w.PD_ID == cast.PD_ID);
                entity.OpeName = pd.Any() ? pd.First().Ope_Name : "";
                entity.Recipe  = cast.LRecipe;
                double m = Priority == 1 ? 1.3 : 1.6;
                entity.PRTime = cast.PT;
                entity.CT     = cast.PT * m;
                var lastCT = Entities.Last().CT;
                var lastPT = Entities.Last().PRTime;
                entity.Plan = Entities.Last().Plan.AddMinutes(lastPT * m);
                if (Entities.Last().Forecast == null)
                {
                    var forecastDate = Entities.Last().WFIn.Value.AddMinutes(lastCT);
                    entity.Forecast = forecastDate > DateTime.Now? Entities.Last().WFIn.Value.AddMinutes(lastPT * m) : DateTime.Now.AddMinutes(lastPT * m);
                }
                else
                {
                    entity.Forecast = Entities.Last().Forecast.Value.AddMinutes(lastPT * m);
                }
                var rmk = RMKCatcher.entities.EntityList.Where(w => w.ModulePD_ID == cast.ModulePD_ID && w.Ope_NO == cast.Ope_NO);
                entity.Remark = rmk.Any() ? rmk.First().Remark : "";
                //EqpList
                var eqps = cast.Eqp_List.Split('|').ToList();
                foreach (var eqp in eqps)
                {
                    var state     = CurStateCatcher.entities.EntityList.Where(w => w.Eqp_ID == eqp);
                    var eqpEntity = new ReqRpt048EqpEntity()
                    {
                        EqpID           = eqp,
                        E10Status       = state.Any() ? state.First().E10_State : "",
                        StateID         = state.Any() ? state.First().Cur_State_ID : "",
                        EqpStateChgTime = state.Any() ? state.First().State_History_Time : DateTime.MinValue
                    };
                    var pms = PmsCatcher.entities.EntityList.Where(w => w.Eqp_ID == eqp && w.Next_Early_Date.CompareTo(entity.Forecast.Value.ToString("yyyy-MM-dd")) <= 0 && w.Next_Late_Date.CompareTo(entity.Forecast.Value.ToString("yyyy-MM-dd")) >= 0);
                    if (pms.Any())
                    {
                        var p = pms.OrderBy(o => o.Next_Early_Date).First();
                        eqpEntity.PMS_Early_Time = p.Next_Early_Date;
                        eqpEntity.PMS_Late_Time  = p.Next_Late_Date;
                        eqpEntity.PMS_Time       = p.Next_PM_Date;
                        eqpEntity.Description    = p.Description;
                    }
                    entity.EqpList.Add(eqpEntity);
                }
                Entities.Add(entity);
            }
        }
        private void SetHistEntities()
        {
            var famHists           = HSCatcher.entities.EntityList;
            var lotHists           = famHists.Where(w => w.Lot_ID == LotID).OrderBy(o => o.Claim_Time);
            var firstIn            = lotHists.First();
            var lotInHists         = lotHists.Where(w => w.Ope_Category == "STB" || w.Ope_Category == "OperationComplete" || w.Claim_Time == firstIn.Claim_Time);
            Report48_Forecast flow = new Report48_Forecast();

            //每天历史记录生成一条entity,去掉过程中的Split记录
            foreach (var hist in lotInHists)
            {
                ReqRpt048Stage2Entity entity = new ReqRpt048Stage2Entity();
                flow              = ForecastCatcher.entities.EntityList.Where(w => w.Ope_NO == hist.Ope_NO && w.MainPD_ID == hist.MainPD_ID).FirstOrDefault() ?? new Report48_Forecast();
                entity.OpeNO      = hist.Ope_NO;
                entity.Department = flow.Department;
                entity.EqpType    = flow.Eqp_Type;
                //EqpList
                var eqps = (flow.Eqp_List == null)?new List <string> (): flow.Eqp_List.Split('|').ToList();
                foreach (var eqp in eqps)
                {
                    entity.EqpList.Add(new ReqRpt048EqpEntity()
                    {
                        EqpID = eqp
                    });
                }
                entity.ModulePD = flow.ModulePD_ID;
                var pd = PDCatcher.entities.EntityList.Where(w => w.PD_ID == hist.PD_ID);
                entity.OpeName = pd.Any()?pd.First().Ope_Name:"";
                entity.Recipe  = flow.LRecipe;
                //PRTime
                double m = 2;
                if (hist.Priority_Class == 1)
                {
                    m = 1.3;
                }
                else if (hist.Priority_Class == 2)
                {
                    m = 1.6;
                }
                entity.PRTime = flow.PT;
                entity.CT     = flow.PT * m;
                entity.WFIn   = hist.Ope_Category == "Split"? famHists.Where(w => w.MainPD_ID == hist.MainPD_ID && w.Ope_NO == hist.Ope_NO).TakeWhile(t => t.Lot_ID != LotID).Last().Claim_Time: hist.Claim_Time;
                //stepcomplete
                if (Entities.Any())
                {
                    Entities.Last().StepComplete = hist.Claim_Time; entity.Plan = Entities.Last().Plan.AddMinutes(Entities.Last().CT);
                }
                else
                {
                    entity.Plan = entity.WFIn.Value;
                }
                //remark
                var rmk = RMKCatcher.entities.EntityList.Where(w => w.ModulePD_ID == flow.ModulePD_ID && w.Ope_NO == flow.Ope_NO);
                entity.Remark = rmk.Any() ? rmk.First().Remark : "";
                Entities.Add(entity);
            }
            //Priority = lotHists.Last().Priority_Class;
            curFlow = flow;
            curHs   = Entities.Last();
            //设置gapmodel
            foreach (var entity in Entities)
            {
                if (entity.WFIn == null || entity.StepComplete == null)
                {
                    continue;
                }
                var holdList = HoldHsCatcher.entities.EntityList.Where(w => w.Ope_NO == entity.OpeNO && w.Claim_Time <= entity.StepComplete && w.Claim_Time >= entity.WFIn);
                if (holdList.Any())
                {
                    ReqRpt048GapComputer computer = new ReqRpt048GapComputer();
                    var holds   = holdList.Where(w => w.Ope_Category != "LotHoldRelease");
                    var release = holdList.Where(w => w.Ope_Category == "LotHoldRelease").ToList();
                    foreach (var hold in holds)
                    {
                        ReqRpt048GapComputerEntity computerEntity = new ReqRpt048GapComputerEntity();
                        computerEntity.ReasonCode = hold.Hold_Reason_Code;
                        computerEntity.StartTime  = hold.Claim_Time;
                        var firstRelease = release.Where(w => w.Hold_Reason_Code == hold.Hold_Reason_Code).FirstOrDefault();
                        if (firstRelease == null)
                        {
                            computerEntity.EndTime = DateTime.Now;
                        }
                        else
                        {
                            computerEntity.EndTime = firstRelease.Claim_Time;
                            release.Remove(firstRelease);
                        }
                        computer.GapComputerEntities.Add(computerEntity);
                    }
                    entity.GapModels = computer.GetResault();
                    foreach (var model in entity.GapModels)
                    {
                        model.Department = GetDepartmentByCode(model.Department);
                    }
                }
            }
            foreach (var dept in CodeCatcher.entities.EntityList)
            {
                var item = new ReqRpt048ChartGapModel();
                item.Department = dept.Description;
                double rawGap = Entities.Sum(s => s.GapWithOutHold == null ? 0 : s.GapWithOutHold.Value);
                double delta  = Entities.Sum(s => s.GapModels.Where(q => q.Department == dept.Description).Sum(p => p.HoldGap));
            }
        }