Exemple #1
0
        public object PostSmartScheduleConfirm([FromBody] SmartTaskOrderArrangeParam arrange)
        {
            var taskOrders = arrange.Confirms;

            if (taskOrders == null || !taskOrders.Any())
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            if (taskOrders.Any(x => !x.Needs.Any()))
            {
                return(Result.GenError <Result>(Error.SmartScheduleNeedLost));
            }

            var userId         = Request.GetIdentityInformation();
            var markedDateTime = DateTime.Now;
            var schedules      = new List <SmartTaskOrderScheduleDetail>();
            var costDays       = HScheduleHelper.ArrangeSchedule(arrange.WorkshopId, ref taskOrders, ref schedules, out _, true, userId, markedDateTime);

            OldWorkFlowHelper.Instance.OnTaskOrderArrangeChanged();
            return(Result.GenError <Result>(Error.Success));
        }
Exemple #2
0
        public object PostSmartScheduleCostDay([FromBody] SmartTaskOrderArrangeParam arrange)
        {
            var taskOrders = arrange.Confirms;
            var wId        = arrange.WorkshopId;

            if (taskOrders == null || !taskOrders.Any())
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            if (taskOrders.Any(x => !x.Needs.Any()))
            {
                return(Result.GenError <Result>(Error.SmartScheduleNeedLost));
            }

            var today      = DateTime.Today;
            var schedules  = new List <SmartTaskOrderScheduleDetail>();
            var costDays   = HScheduleHelper.ArrangeSchedule(wId, ref taskOrders, ref schedules, out var indexes);
            var eStartTime = costDays.Any() ? costDays.Min(x => x.EstimatedStartTime) : today;

            if (eStartTime == default(DateTime))
            {
                eStartTime = today;
            }
            var eEndTime = costDays.Any() ? costDays.Max(x => x.EstimatedEndTime) : today;

            if (eEndTime == default(DateTime))
            {
                eEndTime = today;
            }
            var put    = new List <object>();
            var orders = new List <SmartTaskOrderNeedWithOrder>();
            //设备型号数量
            var deviceList = SmartDeviceHelper.Instance.GetAll <SmartDevice>();
            //人员等级数量
            var operatorList = SmartOperatorHelper.GetAllSmartOperators();
            //按工序排
            var processes = schedules.GroupBy(x => new { x.PId, x.Process, x.Order }).Select(y => y.Key);
            var ts        = costDays.SelectMany(costDay =>
            {
                var taskNeeds = taskOrders.First(x => x.Id == costDay.Id).Needs;
                return(taskNeeds.Where(n => taskOrders.Any(task => task.Id == n.TaskOrderId)).Select(x =>
                {
                    var task = taskOrders.First(t => t.Id == x.TaskOrderId);
                    var schedule = schedules.Where(sc =>
                                                   sc.TaskOrderId == x.TaskOrderId && sc.ProcessId == x.ProcessId && sc.PId == x.PId).ToList();
                    var totalDays = (eEndTime - eStartTime).TotalDays + 1;
                    if (schedule.Count < totalDays)
                    {
                        for (var i = 0; i < (eEndTime - eStartTime).TotalDays + 1; i++)
                        {
                            var t = eStartTime.AddDays(i);
                            if (schedule.All(p => p.ProcessTime != t))
                            {
                                schedule.Add(new SmartTaskOrderScheduleDetail()
                                {
                                    ProcessTime = t
                                });
                            }
                        }

                        schedule = schedule.OrderBy(sc => sc.ProcessTime).ToList();
                    }

                    var scs = schedule.Select(y =>
                    {
                        var d = new SmartTaskOrderSchedulePutAndWarehouseInfoResult
                        {
                            ProcessTime = y.ProcessTime,
                            TaskOrderId = y.TaskOrderId,
                            TaskOrder = y.TaskOrder,
                            Target = y.Target,
                            DoneTarget = y.DoneTarget,
                            Put = y.Put,
                            HavePut = y.HavePut,
                        };

                        if (y.ProductType == 0)
                        {
                            d.Arranges = y.DeviceList.ToDictionary(de => de.Key,
                                                                   de =>
                            {
                                var ope = deviceList.FirstOrDefault(dl => dl.Id == de.Key);
                                return new Tuple <string, int>(ope?.Code ?? "", de.Value);
                            });
                        }
                        else if (d.ProductType == 1)
                        {
                            d.Arranges = y.OperatorsList.ToDictionary(op => op.Key,
                                                                      op =>
                            {
                                var ope = operatorList.FirstOrDefault(dl => dl.Id == op.Key);
                                return new Tuple <string, int>(ope?.Name ?? "", op.Value);
                            });
                        }
                        ;
                        var s = new
                        {
                            Id = y.Id,
                            ProductType = y.ProductType,
                            ProcessTime = y.ProcessTime,
                            Put = y.Put,
                            HavePut = y.HavePut,
                            Target = y.Target,
                            DoneTarget = y.DoneTarget,
                            Data = d
                        };
                        return s;
                    });
                    var need = new
                    {
                        Id = x.Id,
                        TaskOrderId = x.TaskOrderId,
                        TaskOrder = task.TaskOrder,
                        ProductId = x.ProductId,
                        Product = task.Product,
                        DeliveryTime = task.DeliveryTime,
                        ArrangedTime = task.ArrangedTime,
                        PId = x.PId,
                        ProcessId = x.ProcessId,
                        Process = x.Process,
                        Order = x.Order,
                        Put = x.Put,
                        HavePut = x.HavePut,
                        Target = x.Target,
                        DoneTarget = x.DoneTarget,
                        Schedules = scs
                    };
                    return need;
                }));
            });

            put.AddRange(ts);

            orders.AddRange(costDays.SelectMany(x => x.CostDays).GroupBy(y => new { y.PId, y.Process, y.Order }).Select(z => new SmartTaskOrderNeedWithOrder
            {
                Id      = z.Key.PId,
                Process = z.Key.Process,
                Order   = z.Key.Order
            }).OrderBy(z => z.Order));

            var arrangeIndexes = new List <SmartTaskOrderScheduleIndex>();

            foreach (var order in orders)
            {
                for (var i = 0; i < (eEndTime - eStartTime).TotalDays + 1; i++)
                {
                    var t = eStartTime.AddDays(i);
                    if (!indexes.Any(p => p.ProcessTime == t && p.PId == order.Id))
                    {
                        arrangeIndexes.Add(new SmartTaskOrderScheduleIndex
                        {
                            ProcessTime = t,
                            PId         = order.Id,
                        });
                    }
                    else
                    {
                        var ins = indexes.Where(p => p.ProcessTime == t && p.PId == order.Id);
                        arrangeIndexes.Add(new SmartTaskOrderScheduleIndex
                        {
                            ProcessTime = t,
                            PId         = order.Id,
                            Index       = !ins.Any() ? 0 : (ins.Sum(index => index.Index) / ins.Count()).ToRound(2)
                        });
                    }
                }
            }

            var indexs = arrangeIndexes.OrderBy(x => orders.FirstOrDefault(y => y.Id == x.PId)?.Order ?? 0)
                         .ThenBy(z => z.ProcessTime);

            return(new
            {
                errno = 0,
                errmsg = "成功",
                StartTime = eStartTime,
                EndTime = eEndTime,
                Orders = orders,
                Cost = costDays,
                //Schedule = schedules,
                Schedule = schedules.Select(x =>
                                            new
                {
                    x.ProcessTime,
                    x.PId,
                    x.TaskOrder,
                    x.TaskOrderId,
                    x.ProcessId,
                    x.ProductId,
                    x.Target,
                    x.Put,
                    x.Have,
                    x.HavePut,
                    x.LeftPut,
                    x.Rate,
                    x.Stock,
                    x.LeftTarget,
                    x.DoneTarget,
                    x.Done
                }),
                Put = put,
                Indexes = indexs
            });
        }
Exemple #3
0
        public object PostSmartSchedulePreview([FromBody] SmartTaskOrderArrangeParam arrange)
        {
            var taskOrders = arrange.Previews;
            var wId        = arrange.WorkshopId;

            if (taskOrders == null)
            {
                return(Result.GenError <Result>(Error.ParamError));
            }
            var taskIds = taskOrders.GroupBy(x => x.Id).Select(y => y.Key);

            if (taskIds.Count() != taskOrders.Count())
            {
                return(Result.GenError <Result>(Error.SmartTaskOrderDuplicate));
            }
            var result   = new DataResult();
            var allTasks = new List <SmartTaskOrderPreview>();

            if (taskOrders.Any())
            {
                var tOrders = SmartTaskOrderHelper.Instance.GetByIds <SmartTaskOrderPreview>(taskIds);
                if (taskIds.Count() != tOrders.Count())
                {
                    result.errno = Error.SmartTaskOrderNotExist;
                    result.datas.AddRange(taskOrders.Where(x => tOrders.All(y => y.Id != x.Id)).Select(x => x.TaskOrder.IsNullOrEmpty() ? x.Id.ToString() : x.TaskOrder));
                    return(result);
                }

                //var arranged = tOrders.Where(x => x.Arranged);
                //if (arranged.Any())
                //{
                //    result.errno = Error.SmartTaskOrderArranged;
                //    result.datas.AddRange(arranged.Select(x => x.TaskOrder));
                //    return result;
                //}

                foreach (var task in tOrders)
                {
                    var t = taskOrders.FirstOrDefault(x => x.Id == task.Id);
                    if (t == null)
                    {
                        result.errno = Error.SmartTaskOrderNotExist;
                        result.datas.Add(task.TaskOrder);
                    }
                    else
                    {
                        //页面选择顺序
                        task.Order     = !t.Arranged && t.Order == 0 ? int.MaxValue : t.Order;
                        task.StartTime = t.StartTime;
                        task.EndTime   = t.EndTime;
                        task.Needs     = t.Needs;
                    }
                }
                allTasks.AddRange(tOrders);
            }
            if (result.errno != Error.Success)
            {
                return(result);
            }
            var otherTasks = SmartTaskOrderHelper.GetArrangedButNotDoneSmartTaskOrders(wId);

            if (otherTasks.Any())
            {
                taskIds = otherTasks.Select(x => x.Id);
                var taskNeeds = SmartTaskOrderNeedHelper.GetSmartTaskOrderNeedsByTaskOrderIds(wId, taskIds);
                foreach (var otherTask in otherTasks)
                {
                    var aTask = allTasks.FirstOrDefault(x => x.Id == otherTask.Id);
                    var needs = taskNeeds.Where(need => need.TaskOrderId == otherTask.Id);
                    if (aTask != null)
                    {
                        aTask.Arranged = true;
                        if (!aTask.Needs.Any())
                        {
                            aTask.Needs.AddRange(needs);
                        }
                        else
                        {
                            aTask.Needs = aTask.Needs.Select(x =>
                            {
                                var need = needs.FirstOrDefault(y => y.TaskOrderId == x.TaskOrderId && y.PId == x.PId);
                                if (need != null)
                                {
                                    x.DoneTarget = need.DoneTarget;
                                    x.HavePut    = need.HavePut;
                                }
                                return(x);
                            }).ToList();
                        }
                    }
                    else
                    {
                        var t = ClassExtension.ParentCopyToChild <SmartTaskOrder, SmartTaskOrderPreview>(otherTask);
                        t.Arranged = true;
                        t.Needs.AddRange(needs);
                        allTasks.Add(t);
                    }
                }
            }

            if (result.errno != Error.Success)
            {
                return(result);
            }
            var productIds = allTasks.GroupBy(x => x.ProductId).Select(y => y.Key);

            if (!productIds.Any())
            {
                return(Result.GenError <Result>(Error.SmartProductNotExist));
            }

            var products = SmartProductHelper.Instance.GetByIds <SmartProduct>(productIds);

            if (products.Count() != productIds.Count())
            {
                return(Result.GenError <Result>(Error.SmartProductNotExist));
            }

            var productCapacities = SmartProductCapacityHelper.GetSmartProductCapacities(productIds);

            if (!productCapacities.Any())
            {
                return(Result.GenError <Result>(Error.SmartProductCapacityNotExist));
            }

            var capacityIds = products.GroupBy(x => x.CapacityId).Select(y => y.Key);

            if (!capacityIds.Any())
            {
                return(Result.GenError <Result>(Error.SmartCapacityNotExist));
            }
            var capacityLists = SmartCapacityListHelper.GetSmartCapacityListsWithOrder(capacityIds);

            foreach (var productId in productIds)
            {
                var tasks       = allTasks.Where(x => x.ProductId == productId);
                var product     = products.FirstOrDefault(x => x.Id == productId);
                var pCapacities = productCapacities.Where(x => x.ProductId == productId);
                var cLists      = capacityLists.Where(x => x.CapacityId == product.CapacityId);
                if (cLists.Count() != pCapacities.Count())
                {
                    result.errno = Error.SmartProductCapacityNotExist;
                    result.datas.AddRange(tasks.Select(x => x.TaskOrder));
                }
            }

            if (result.errno != Error.Success)
            {
                return(result);
            }

            var data = allTasks.ToDictionary(x => x.Id, x =>
            {
                var t     = ClassExtension.ParentCopyToChild <SmartTaskOrder, SmartTaskOrderPreview>(x);
                t.Product = products.FirstOrDefault(y => y.Id == x.ProductId)?.Product ?? "";
                return(t);
            });

            foreach (var task in allTasks)
            {
                var productId   = task.ProductId;
                var product     = products.FirstOrDefault(x => x.Id == productId);
                var pCapacities = productCapacities.Where(x => x.ProductId == productId);
                var cLists      = capacityLists.Where(x => x.CapacityId == product.CapacityId);
                var target      = task.Target;
                foreach (var list in cLists.Reverse())
                {
                    var need       = task.Needs.FirstOrDefault(x => x.Order == list.Order && x.ProcessId == list.ProcessId);
                    var stock      = need?.Stock ?? 0;
                    var doneTarget = need?.DoneTarget ?? 0;
                    var havePut    = need?.HavePut ?? 0;

                    if (target < stock)
                    {
                        stock  = target;
                        target = 0;
                    }
                    else
                    {
                        target -= stock;
                    }

                    var pCapacity = pCapacities.FirstOrDefault(x => x.ProcessId == list.ProcessId);
                    var rate      = 0m;
                    var y         = pCapacity;
                    if (y.DeviceList.Any())
                    {
                        rate = y.DeviceList.First().Rate;
                    }
                    else if (y.OperatorList.Any())
                    {
                        rate = y.OperatorList.First().Rate;
                    }

                    var put = rate != 0 ? (int)Math.Ceiling((target) * 100 / rate) : 0;
                    data[task.Id].Needs.Insert(0, new SmartTaskOrderNeedDetail
                    {
                        TaskOrderId = task.Id,
                        ProductId   = productId,
                        ProcessId   = list.ProcessId,
                        PId         = list.PId,
                        Target      = target,
                        DoneTarget  = doneTarget,
                        Stock       = stock,
                        Rate        = rate,
                        Put         = put,
                        HavePut     = havePut,
                        Process     = list.Process,
                        Order       = list.Order
                    });
                    target = put;
                }
            }
            var r = new SmartTaskOrderNeedWithOrderResult();

            r.datas.AddRange(data.Values.OrderBy(x => x.Arranged).ThenBy(x => x.ModifyId));
            var orders = data.Values.SelectMany(x => x.Needs).GroupBy(y => new { y.PId, y.Order, y.Process }).Select(z => new SmartTaskOrderNeedWithOrder
            {
                Id      = z.Key.PId,
                Process = z.Key.Process,
                Order   = z.Key.Order
            });

            r.Orders.AddRange(orders.OrderBy(z => z.Order));
            return(r);
        }