예제 #1
0
        /// <summary>
        /// Receives the prior items to a given ProductionOrderWorkSchedule
        /// </summary>
        /// <param name="productionOrderWorkSchedule"></param>
        /// <returns>List<ProductionOrderWorkSchedule></returns>
        public Task <List <ProductionOrderWorkSchedule> > GetFollowerProductionOrderWorkSchedules(ProductionOrderWorkSchedule productionOrderWorkSchedule)
        {
            var rs = Task.Run(() =>
            {
                var priorItems = new List <ProductionOrderWorkSchedule>();
                // If == min Hierarchy --> get Pevious Article -> Highest Hierarchy Workschedule Item
                var maxHierarchy = ProductionOrderWorkSchedules.Where(x => x.ProductionOrderId == productionOrderWorkSchedule.ProductionOrderId)
                                   .Max(x => x.HierarchyNumber);

                if (maxHierarchy == productionOrderWorkSchedule.HierarchyNumber)
                {
                    // get Previous Article

                    priorItems.AddRange(GetParents(productionOrderWorkSchedule));
                }
                else
                {
                    // get Previous Workschedule
                    var previousPows =
                        ProductionOrderWorkSchedules.Where(
                            x => x.ProductionOrderId == productionOrderWorkSchedule.ProductionOrderId &&
                            x.HierarchyNumber > productionOrderWorkSchedule.HierarchyNumber)
                        .OrderBy(x => x.HierarchyNumber).FirstOrDefault();
                    priorItems.Add(previousPows);
                }
                return(priorItems);
            });

            return(rs);
        }
예제 #2
0
        /*public ProductionOrder CreateBomForProductionOrder(decimal quantity, ProductionOrder mainProductionOrder)
         * {
         *  var article = Articles.Include(a => a.ArticleBoms).ThenInclude(c => c.ArticleChild).Single(a => a.Id == mainProductionOrder.ArticleId);
         *  foreach (var item in article.ArticleBoms)
         *  {
         *      var thisQuantity = quantity * item.Quantity;
         *
         *      var prodOrder = new ProductionOrder
         *      {
         *          ArticleId = item.ArticleChildId,
         *          Name = "Prod. Auftrag: " + article.Name,
         *          Quantity = thisQuantity,
         *      };
         *      ProductionOrders.Add(prodOrder);
         *
         *      var prodOrderBom = new ProductionOrderBom
         *      {
         *          Quantity = thisQuantity,
         *          ProductionOrderParentId = mainProductionOrder.Id,
         *
         *      };
         *      mainProductionOrder.ProductionOrderBoms.Add(prodOrderBom);
         *
         *      CreateDemandProductionOrderBom(item.ArticleChildId, thisQuantity);
         *  }
         *  SaveChanges();
         *  return mainProductionOrder;
         * }*/


        public void CreateProductionOrderWorkSchedules(ProductionOrder productionOrder)
        {
            var abstractWorkSchedules = WorkSchedules.Where(a => a.ArticleId == productionOrder.ArticleId).ToList();

            foreach (var abstractWorkSchedule in abstractWorkSchedules)
            {
                //add specific workSchedule
                var workSchedule = new ProductionOrderWorkSchedule();
                abstractWorkSchedule.CopyPropertiesTo <IWorkSchedule>(workSchedule);
                workSchedule.ProductionOrderId = productionOrder.Id;
                workSchedule.MachineId         = null;
                workSchedule.ProducingState    = ProducingState.Created;
                workSchedule.Duration         *= (int)productionOrder.Quantity;
                ProductionOrderWorkSchedules.Add(workSchedule);
                SaveChanges();
            }
        }
예제 #3
0
        /// <summary>
        /// returns the Production Order Work Schedules for a given Order
        /// </summary>
        /// <param name="orderId"></param>
        /// <returns></returns>
        public Task <List <ProductionOrderWorkSchedule> > GetProductionOrderWorkScheduleByOrderId(int orderId)
        {
            return(Task.Run(() =>
            {
                // get the corresponding Order Parts to Order
                var demands = Demands.OfType <DemandOrderPart>()
                              .Include(x => x.OrderPart)
                              .Where(o => o.OrderPart.OrderId == orderId)
                              .ToList();

                // ReSharper Linq
                var demandboms = demands.SelectMany(demand => Demands.OfType <DemandProductionOrderBom>()
                                                    .Where(a => a.DemandRequesterId == demand.Id)).ToList();

                // get Demand Providers for this Order
                var demandProviders = new List <DemandProviderProductionOrder>();
                foreach (var order in (Demands.OfType <DemandProviderProductionOrder>()
                                       .Join(demands, c => c.DemandRequesterId, d => ((IDemandToProvider)d).Id, (c, d) => c)))
                {
                    demandProviders.Add(order);
                }

                var demandBomProviders = (Demands.OfType <DemandProviderProductionOrder>()
                                          .Join(demandboms, c => c.DemandRequesterId, d => d.Id, (c, d) => c)).ToList();

                // get ProductionOrderWorkSchedule for
                var pows = ProductionOrderWorkSchedules.Include(x => x.ProductionOrder).Include(x => x.Machine).Include(x => x.MachineGroup).AsNoTracking();
                var powDetails = pows.Join(demandProviders, p => p.ProductionOrderId, dp => dp.ProductionOrderId,
                                           (p, dp) => p).ToList();

                var powBoms = (from p in pows
                               join dbp in demandBomProviders on p.ProductionOrderId equals dbp.ProductionOrderId
                               select p).ToList();

                powDetails.AddRange(powBoms);
                return powDetails;
            }));
        }