Exemple #1
0
        // Get Line by User Organization
        public IList <GL_LineDTO> GetLines(int Plant_Organization_UID, int?FunPlant_Organization_UID, int BG_Organization_UID, bool?IsEnabled)
        {
            IQueryable <GL_Line> result = null;

            if (IsEnabled != null)
            {
                if (Plant_Organization_UID == 0)
                {
                    result = _lineRepository.GetMany(o => o.IsEnabled == IsEnabled).OrderByDescending(o => o.Modified_Date);
                }
                else
                {
                    if (BG_Organization_UID != 0)
                    {
                        if (FunPlant_Organization_UID != null && FunPlant_Organization_UID != 0)
                        {
                            result = _lineRepository.GetMany(
                                x =>
                                x.Plant_Organization_UID == Plant_Organization_UID &&
                                x.FunPlant_Organization_UID == FunPlant_Organization_UID &&
                                x.BG_Organization_UID == BG_Organization_UID &&
                                x.IsEnabled == IsEnabled
                                ).OrderByDescending(o => o.Modified_Date);
                        }
                        else
                        {
                            result = _lineRepository.GetMany(
                                x =>
                                x.Plant_Organization_UID == Plant_Organization_UID &&
                                x.BG_Organization_UID == BG_Organization_UID &&
                                x.IsEnabled == IsEnabled
                                ).OrderByDescending(o => o.Modified_Date);
                        }
                    }
                    else
                    {
                        result = _lineRepository.GetMany(x =>
                                                         x.Plant_Organization_UID == Plant_Organization_UID && x.IsEnabled == IsEnabled).OrderByDescending(o => o.Modified_Date);
                    }
                }
            }
            else
            {
                if (Plant_Organization_UID == 0)
                {
                    result = _lineRepository.GetAll();
                }
                else
                {
                    if (BG_Organization_UID != 0)
                    {
                        if (FunPlant_Organization_UID != null && FunPlant_Organization_UID != 0)
                        {
                            result = _lineRepository.GetMany(
                                x =>
                                x.Plant_Organization_UID == Plant_Organization_UID &&
                                x.FunPlant_Organization_UID == FunPlant_Organization_UID &&
                                x.BG_Organization_UID == BG_Organization_UID
                                //&& x.IsEnabled == IsEnabled
                                ).OrderByDescending(o => o.Modified_Date);
                        }
                        else
                        {
                            result = _lineRepository.GetMany(
                                x =>
                                x.Plant_Organization_UID == Plant_Organization_UID &&
                                x.BG_Organization_UID == BG_Organization_UID
                                //&& x.IsEnabled == IsEnabled
                                ).OrderByDescending(o => o.Modified_Date);
                        }
                    }
                    else
                    {
                        result = _lineRepository.GetMany(x =>
                                                         x.Plant_Organization_UID == Plant_Organization_UID
                                                         //&& x.IsEnabled == IsEnabled
                                                         ).OrderByDescending(o => o.Modified_Date);
                    }
                }
            }
            // entity mapper
            var dtos = new List <GL_LineDTO>();

            //var dtos = AutoMapper.Mapper.Map<IList<GL_LineDTO>>(result);
            foreach (var item in result)
            {
                //构造负责人数据
                var responsibleList = new List <GL_LineShiftResposibleUserDTO>();
                //过滤可用的班次
                var enabledResponsibleUser = item.GL_LineShiftResposibleUser.Where(x => x.GL_ShiftTime.IsEnabled);
                foreach (var responible in enabledResponsibleUser)
                {
                    var responsibleDto = new GL_LineShiftResposibleUserDTO()
                    {
                        ResponsibleUser = AutoMapper.Mapper.Map <SystemUserDTO>(responible.System_Users),
                        GL_Line         = AutoMapper.Mapper.Map <GL_LineDTO>(responible.GL_Line),
                        GL_ShiftTime    = AutoMapper.Mapper.Map <GL_ShiftTimeDTO>(responible.GL_ShiftTime)
                    };
                    responsibleList.Add(responsibleDto);
                }

                var dto = AutoMapper.Mapper.Map <GL_LineDTO>(item);
                dto.GL_LineShiftResposibleUserList = responsibleList;
                dtos.Add(dto);
            }
            return(dtos);
        }
Exemple #2
0
        /// <summary>
        /// 同步LineShiftPerf 数据
        /// </summary>
        public void SyncLineShiftPerf()
        {
            //var customerService = new System_ProjectService(new SystemProjectRepository(_DatabaseFactory));
            //var lineService = new GL_LineService(new GL_LineRepository(_DatabaseFactory));
            //var shiftTimeService = new GL_ShiftTimeService(new GL_ShiftTimeRepository(_DatabaseFactory));
            //var buildPlanService = new GL_BuildPlanService(new GL_BuildPlanRepository(_DatabaseFactory));
            //var goldenLineService = new GoldenLineService(new GoldenLineRepository(_DatabaseFactory),
            //    new GL_GoldenStationCTRecordRepository(_DatabaseFactory),
            //    new GL_ShiftTimeRepository(_DatabaseFactory), new SystemProjectRepository(_DatabaseFactory));
            //var stationService = new GL_StationService(new GL_StationRepository(_DatabaseFactory));
            //var WIPShiftOutputService = new GL_WIPShiftOutputService(new GL_WIPShiftOutputRepository(_DatabaseFactory));
            //var WIPShiftBatchOutputService = new GL_WIPShiftBatchOutputService(new GL_WIPShiftBatchOutputRepository(_DatabaseFactory));

            var customerList = systemProjectRepository.GetAll().ToList();

            //customerService.Query(new QueryModel<System_ProjectModelSearch>());
            customerList = customerList.Where(p => p.MESProject_Name != null && p.MESProject_Name != "").ToList();
            var now = DateTime.Now; //当前时间

            foreach (var customer in customerList)
            {
                var shiftTimeList = shiftTimeRepository.GetMany(x => x.BG_Organization_UID == customer.Organization_UID && x.IsEnabled == true);
                //shiftTimeService.Query(new QueryModel<GL_ShiftTimeModelSearch>() { Equal = new GL_ShiftTimeModelSearch() { BG_Organization_UID = customer.Organization_UID, IsEnabled = true } });
                //shiftTimeList = shiftTimeList.Where(s => s.FunPlant_Organization_UID == customer.FunPlant_Organization_UID).ToList(); //班次不再需要功能厂过滤
                var currentShiftTime = GetCurrentShift(shiftTimeList.ToList(), now);
                if (currentShiftTime != null)
                {
                    var startTimePair = currentShiftTime.StartTime.Split(':');
                    var startHour     = int.Parse(startTimePair[0]);
                    var startMinute   = int.Parse(startTimePair[1]);

                    var endTimePair = currentShiftTime.End_Time.Split(':');
                    var endHour     = int.Parse(endTimePair[0]);
                    var endMinute   = int.Parse(endTimePair[1]);
                    //var startTime = currentShiftTime.StartTime;
                    var startDateTime = new DateTime(now.Year, now.Month, now.Day, startHour, startMinute, 0);
                    var endDateTime   = new DateTime(now.Year, now.Month, now.Day, endHour, endMinute, 0);

                    if (startDateTime > endDateTime)
                    {
                        //班次从昨天延续到今天
                        if (now < endDateTime)
                        {
                            startDateTime = startDateTime.AddDays(-1);
                        }
                        else
                        {
                            //从今天延续到明天
                            endDateTime = endDateTime.AddDays(1);
                        }
                    }

                    var outputDate = startDateTime.ToString("yyyy-MM-dd");

                    //由于GoldenLine 和OEE 共用线体GL_Line,所以线体的工站GL_Station,栏位IsGoldenLine == true 才是GoldenLine 的工站,这条线也是GoldenLine, 否则这条线不是GoldenLine(OEE 的线不在此计算),不用计算
                    var lineList = lineRepository.GetMany(x => x.CustomerID == customer.Project_UID && x.IsEnabled == true && x.GL_Station.Any(s => s.IsGoldenLine == true));
                    //lineService.Query(new QueryModel<GL_LineModelSearch>() { Equal = new GL_LineModelSearch() { CustomerID = customer.Project_UID, IsEnabled = true } }).Where(l => l.GL_Station.Any(s => s.IsGoldenLine == true));
                    foreach (var line in lineList)
                    {
                        int     linePlanOutput = 0;
                        int     actualOutput   = 0;
                        decimal UPH            = 3600 / line.CycleTime;
                        //公式 Standard Output=UPH*Working hours=(3600/bottleneck cycle time)*Working hours.
                        int    standOutput  = Convert.ToInt32(Convert.ToDecimal((DateTime.Now - startDateTime).TotalSeconds) / line.CycleTime);//实际输出超过标准输出时,前端显示标红
                        int    planDownTime = 0;
                        double upDownTime   = 0;
                        var    standCT      = line.CycleTime; //获取标准CT
                        double runTime      = 0;

                        decimal actualOutputVSPlan         = 0;
                        decimal actualOutputVSRealTimePlan = 0;
                        decimal actualOutputVSStdOutput    = 0;
                        decimal lineUtil   = 0;
                        int     actualHC   = 0;
                        decimal vaole      = 0;
                        var     lineStatus = goldenLineRepository.GetLineStatus(line.LineID);

                        //PlanOutput 从BuildPlan 获取, BuildPlan.OutputDate 为当天班次的开始时间
                        var buildPlanList = buildPlanRepository.GetMany(x => x.LineID == line.LineID && x.ShiftTimeID == currentShiftTime.ShiftTimeID && x.OutputDate == outputDate).ToList();
                        //buildPlanService.Query(new QueryModel<GL_BuildPlanModelSearch>() { Equal = new GL_BuildPlanModelSearch() { LineID = line.LineID, ShiftTimeID = currentShiftTime.ShiftTimeID, OutputDate = startDateTime.ToString("yyyy-MM-dd") } });
                        if (buildPlanList.Count > 0)
                        {
                            var buildPlan = buildPlanList[0];
                            linePlanOutput = buildPlan.PlanOutput;
                        }
                        //获取output
                        actualOutput = goldenLineRepository.GetLineOutput(line.LineID, startDateTime, endDateTime);
                        //goldenLineService.GetLineOutput(line.LineID, startDateTime, endDateTime);

                        //获取StartTime,用来算PlanDownTime
                        var lineStartTime = goldenLineRepository.GetStartTime(customer.MESProject_Name, line.MESLineName, line.Plant_Organization_UID, startDateTime, endDateTime);
                        if (lineStartTime != null)
                        {
                            planDownTime = (int)(lineStartTime.Value - startDateTime).TotalSeconds;
                        }

                        //获取UPDownTime
                        upDownTime = goldenLineRepository.GetUnPlanDownTime(customer.MESProject_Name, line.MESLineName, line.Plant_Organization_UID, standCT, startDateTime, endDateTime);

                        //获取RunTime
                        runTime = goldenLineRepository.GetRunTime(customer.MESProject_Name, line.MESLineName, line.Plant_Organization_UID, standCT, startDateTime, endDateTime);

                        //ActualOutputVSPlan
                        if (linePlanOutput == 0)
                        {
                            actualOutputVSPlan = 0;
                        }
                        else
                        {
                            //如果actualOutput超过linePlanOutput, 取linePlanOutput
                            actualOutputVSPlan = Math.Round((decimal)(actualOutput > linePlanOutput ? linePlanOutput : actualOutput) / linePlanOutput, 3);
                            if (actualOutputVSPlan > 1)
                            {
                                actualOutputVSPlan = 1;
                            }
                        }

                        //ActualOutputVSRealTimePlan, 相当于挣值
                        var shiftTimeSpanSeconds = (endDateTime - startDateTime).TotalSeconds;
                        var realTimePlanOutput   = linePlanOutput / shiftTimeSpanSeconds * (runTime + upDownTime + planDownTime); //截止当前时间的计划产能数量
                        if (linePlanOutput == 0 || shiftTimeSpanSeconds == 0 || realTimePlanOutput == 0)
                        {
                            actualOutputVSRealTimePlan = 0;
                        }
                        else
                        {
                            actualOutputVSRealTimePlan = Math.Round((decimal)actualOutput / (decimal)realTimePlanOutput, 3);
                            if (actualOutputVSRealTimePlan > 1)
                            {
                                actualOutputVSRealTimePlan = 1;
                            }
                        }

                        //ActualOutputVSStdOutput
                        if (standOutput == 0)
                        {
                            actualOutputVSStdOutput = 0;
                        }
                        else
                        {
                            actualOutputVSStdOutput = Math.Round((decimal)actualOutput / standOutput, 3);
                            if (actualOutputVSStdOutput > 1)
                            {
                                actualOutputVSStdOutput = 1;
                            }
                        }

                        //LineUtil
                        if (runTime + planDownTime + upDownTime == 0)
                        {
                            lineUtil = 0;
                        }
                        else
                        {
                            lineUtil = Math.Round((decimal)runTime / (decimal)(runTime + planDownTime + upDownTime), 3);
                            if (lineUtil > 1)
                            {
                                lineUtil = 0;
                            }
                        }

                        //VAOLE,相当于工人的工作效率,即工作时间有多少百分比转化成输出
                        //公式:
                        //StdUPH = PlanOutput / 10   (原本一个班次12小时,除去2小时吃饭时间,即10小时工作时间)
                        //SMH = Plan HC / StdUPH
                        //VAOLE= ( SMH * Actual Output ) / ( Actual HC * Actual Available Time )
                        //输出工站获取Output
                        // var outputStation = stationService.Query(new QueryModel<GL_StationModelSearch>() { Equal = new GL_StationModelSearch() { LineID = line.LineID, IsOutput = true } }).FirstOrDefault();
                        var outputStation = goldenLineRepository.GetStationDTOIsOutput(line.LineID);
                        if (outputStation != null)
                        {
                            //获取产线的实际输出(即产线的输出工站的输出)
                            var output = goldenLineRepository.GetLineOutput(line.LineID, startDateTime, null);
                            //var totoalCT = stationService.Query(new QueryModel<GL_StationModelSearch>() { Equal = new GL_StationModelSearch() { LineID = line.LineID, IsOutput = true } }).Sum(s => s.CycleTime);
                            //var buildPlan = buildPlanService.Query(new QueryModel<GL_BuildPlanModelSearch>() { Equal = new GL_BuildPlanModelSearch() { CustomerID = customer.Project_UID, LineID = line.LineID } }).FirstOrDefault();
                            var buildPlans = buildPlanRepository.GetMany(x => x.CustomerID == customer.Project_UID && x.LineID == line.LineID && x.ShiftTimeID == currentShiftTime.ShiftTimeID && x.OutputDate == outputDate).ToList();
                            //buildPlanService.Query(new QueryModel<GL_BuildPlanModelSearch>() { Equal = new GL_BuildPlanModelSearch() { CustomerID = customer.Project_UID, LineID = line.LineID, ShiftTimeID = currentShiftTime.ShiftTimeID, OutputDate = startDateTime.ToString("yyyy-MM-dd") } });
                            if (buildPlans != null && buildPlans.Count > 0)
                            {
                                var buildPlan = buildPlans.FirstOrDefault();
                                // if (buildPlan!= null)
                                //{
                                if (buildPlan.ActualHC != null)
                                {
                                    actualHC = buildPlan.ActualHC.Value;
                                }
                                double workingTime = 0; //单位:秒
                                if (now >= endDateTime)
                                {
                                    workingTime = (endDateTime - startDateTime).TotalSeconds;
                                }
                                else
                                {
                                    workingTime = (now - startDateTime).TotalSeconds;
                                }
                                //vaole = (decimal)(output * line.CycleTime) / (decimal)(actualHC * workingTime);
                                decimal StdUPH = (decimal)buildPlan.PlanOutput / 10;    //除以10小时
                                if (StdUPH > 0)
                                {
                                    if (buildPlan.PlanHC != null)
                                    {
                                        decimal SMH = buildPlan.PlanHC.Value / StdUPH;
                                        if (actualHC > 0 && workingTime > 0)
                                        {
                                            vaole = (SMH * output) / (decimal)(actualHC * (workingTime / 3600)) * (decimal)1.2;
                                        }
                                    }
                                }
                            }
                        }


                        var lineShiftPerf = new GL_LineShiftPerf()
                        {
                            CustomerID                 = customer.Project_UID,
                            LineID                     = line.LineID,
                            OutputDate                 = startDateTime.ToString("yyyy-MM-dd"),
                            ShiftTimeID                = currentShiftTime.ShiftTimeID,
                            PlanOutput                 = linePlanOutput,
                            StandOutput                = standOutput,
                            ActualOutput               = actualOutput,
                            UPH                        = UPH,
                            LineStatus                 = (int)lineStatus,
                            PlanDownTime               = planDownTime,
                            UPDownTime                 = (int)upDownTime, //转换问题
                            RunTime                    = (int)runTime,    //转换问题
                            ActualOutputVSPlan         = actualOutputVSPlan,
                            ActualOutputVSRealTimePlan = actualOutputVSRealTimePlan,
                            ActualOutputVSStdOutput    = actualOutputVSStdOutput,
                            LineUtil                   = lineUtil,
                            CapacityLoading            = 0,
                            VAOLE                      = vaole,
                            Modified_Date              = DateTime.Now
                        };

                        InsertOrUpdateLineShiftPerf(lineShiftPerf);
                    }
                }
            }
            unitOfWork.Commit();
        }