Browse Source

同时只能有一个出库

林豪 左 3 years ago
parent
commit
10104a360e
1 changed files with 116 additions and 111 deletions
  1. 116 111
      Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

+ 116 - 111
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -158,6 +158,7 @@ namespace WCS.Service.Works.SRM
                 else if (LastIsOut)
                 {
                     #region 入库
+
                     var floor = obj.Entity.Get<int>("LastInFloor");
                     floor = floor % 2 + 1;
                     obj.Entity.Set("LastInFloor", floor);
@@ -257,126 +258,130 @@ namespace WCS.Service.Works.SRM
                 {
                     #region 出库
 
-                    var floor = obj.Entity.Get<int>("LastOutFloor");
-                    floor = floor % 2 + 1;
-                    obj.Entity.Set("LastOutFloor", floor);
-                    if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
-
-                    //获取当前堆垛机所有的放货点
-                    var list = obj.GetDeliveryPoint();
-
-                    list = list.Where(v =>
+                    obj.EXOutStock(obj =>
                     {
-                        //true:满足条件  false:不满足条件
-                        //返回结果为无货的设备  默认无货
-                        var res = true;
-                        //放货点是否有货
-                        if (v.Data.VoucherNo != v.Data2.VoucherNo) res = false;
-                        else if (v.Data3.Status.HasFlag(StationStatus.运行状态位)) res = false;
-                        else if (v.Data2.Status.HasFlag(IstationStatus.光电状态)) res = false;
-                        else if (v.Data2.Request == IstationRequest.堆垛机放货完成请求目标地址) res = false;
-                        else if (v.Data2.Tasknum > 10000) res = false;
-                        return res;
-                    }).ToList();
-
-                    //没有可用货位
-                    if (list.Count == 0) return;
-
-                    //月台所有设备当前有的任务号
-                    var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
-                    //堆垛机设备
-                    var srm = obj.Entity.CODE;
-                    DB.Do(db =>
-                    {
-                        //堆垛机当前是否有正在执行的任务
-                        if (db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)) throw new WarnException($"[{deviceCode}]有正在执行的出库任务");
-
-                        //找出等待执行的出库任务
-                        var waitTask = db.Default.Set<WCS_TASK>().Where(v => v.STATUS == TaskStatus.新建)
-                                                      .Where(v => v.DEVICE == srm)
-                                                      .Where(v => v.TYPE == TaskType.出库)
-                                                      .Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)).ToList();
-
-                        //同时对结果进行排序,分组
-                        var maxnum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();
-                        var outDepotList = waitTask.Where(v =>
-                                            {
-                                                var max = v.ADDRTO == "G1340" ? 4 : maxnum;
-                                                return db.Default.Set<WCS_TASK>()
-                                                   .AsNoTracking()
-                                                   .Where(d => d.TYPE == TaskType.出库)
-                                                   .Where(d => d.STATUS > TaskStatus.新建)
-                                                   .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
-                                                   .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
-                                                   .GroupBy(d => d.TaskGroupKey).Count() < max;
-                                            })
-                                .OrderByDescending(v => v.Priority)
-                                .ThenBy(v => v.FLOOR == floor ? 0 : 1)
-                                .ThenBy(v =>
-                                {
-                                    return db.Default.Set<WCS_TASK>()
-                                                     .AsNoTracking()
-                                                     .Where(d => d.TYPE == TaskType.出库)
-                                                     .Where(d => d.STATUS > TaskStatus.新建)
-                                                     .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
-                                                     .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
-                                                     .GroupBy(d => d.TaskGroupKey).Count();
-                                })
-                                .ThenBy(v => v.CREATETIME)
-                                .GroupBy(v => v.ADDRTO).ToArray();
-
-                        //获取两个个可执行任务,此时这两个任务的目标地址是一致的
-                        var tasks = outDepotList.GetSrmValidTaskList(db, obj).GetOutTask();
-
-                        #region 校验两个产品是否为同规格
-
-                        if (tasks.Length == 2)
-                        {
-                            var length = tasks.OrderByDescending(v => v.Length).ToArray();
-                            //较大的长度减去较小的长度,差大于两百表示为不同规格产品
-                            if (length[0].Length - length[1].Length > 200)
-                            {
-                                tasks = tasks.Take(1).ToArray();
-                            }
-                        }
+                        obj.CheckOutTask();
+                        var floor = obj.Entity.Get<int>("LastOutFloor");
+                        floor = floor % 2 + 1;
+                        obj.Entity.Set("LastOutFloor", floor);
+                        if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
 
-                        #endregion 校验两个产品是否为同规格
+                        //获取当前堆垛机所有的放货点
+                        var list = obj.GetDeliveryPoint();
 
-                        for (int i = 0; i < tasks.Length; i++)
+                        list = list.Where(v =>
                         {
-                            var item = tasks[i];
-                            var task = db.Default.Set<WCS_TASK>().Find(item.ID);
-                            var oldTaskSTATUS = task.STATUS;
-                            task.STARTTIME = DateTime.Now;
-                            task.UPDATETIME = DateTime.Now;
-                            task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
-                            task.DEVICE = obj.Entity.CODE;
-                            task.TaskGroupKey = tasks.Length switch
+                            //true:满足条件  false:不满足条件
+                            //返回结果为无货的设备  默认无货
+                            var res = true;
+                            //放货点是否有货
+                            if (v.Data.VoucherNo != v.Data2.VoucherNo) res = false;
+                            else if (v.Data3.Status.HasFlag(StationStatus.运行状态位)) res = false;
+                            else if (v.Data2.Status.HasFlag(IstationStatus.光电状态)) res = false;
+                            else if (v.Data2.Request == IstationRequest.堆垛机放货完成请求目标地址) res = false;
+                            else if (v.Data2.Tasknum > 10000) res = false;
+                            return res;
+                        }).ToList();
+
+                        //没有可用货位
+                        if (list.Count == 0) return;
+
+                        //月台所有设备当前有的任务号
+                        var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
+                        //堆垛机设备
+                        var srm = obj.Entity.CODE;
+                        DB.Do(db =>
+                        {
+                            //堆垛机当前是否有正在执行的任务
+                            if (db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)) throw new WarnException($"[{deviceCode}]有正在执行的出库任务");
+
+                            //找出等待执行的出库任务
+                            var waitTask = db.Default.Set<WCS_TASK>().Where(v => v.STATUS == TaskStatus.新建)
+                                                          .Where(v => v.DEVICE == srm)
+                                                          .Where(v => v.TYPE == TaskType.出库)
+                                                          .Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)).ToList();
+
+                            //同时对结果进行排序,分组
+                            var maxnum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();
+                            var outDepotList = waitTask.Where(v =>
                             {
-                                1 => $"{tasks[0].ID}_0",
-                                2 => $"{tasks[0].ID}_{tasks[1].ID}",
-                                _ => throw new WarnException($"可用任务数异常{tasks.Length}"),
-                            };
-                            var fork = obj.GetFork(item, i);
-                            //获取站台及下一个地址
-                            task.GetSrmStationAndaddNext(fork);
-                            var msg = "";
-                            if (fork == SrmFork.货叉1)
-                                msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_1}-{obj.Data.SCol_1}-{obj.Data.SLayer_1}][{obj.Data.ELine_1}][{obj.Data.VoucherNo_1}]";
-                            else
-                                msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_2}-{obj.Data.SCol_2}-{obj.Data.SLayer_2}][{obj.Data.ELine_2}][{obj.Data.VoucherNo_2}]";
-                            task.CreateStatusLog(db, msg, this.GetType());
-                            item.SRMSTATION = task.SRMSTATION;
-                            if (fork == SrmFork.货叉1) // 列数较小的放一工位
+                                var max = v.ADDRTO == "G1340" ? 4 : maxnum;
+                                return db.Default.Set<WCS_TASK>()
+                                   .AsNoTracking()
+                                   .Where(d => d.TYPE == TaskType.出库)
+                                   .Where(d => d.STATUS > TaskStatus.新建)
+                                   .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
+                                   .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
+                                   .GroupBy(d => d.TaskGroupKey).Count() < max;
+                            })
+                                    .OrderByDescending(v => v.Priority)
+                                    .ThenBy(v => v.FLOOR == floor ? 0 : 1)
+                                    .ThenBy(v =>
+                                    {
+                                        return db.Default.Set<WCS_TASK>()
+                                                         .AsNoTracking()
+                                                         .Where(d => d.TYPE == TaskType.出库)
+                                                         .Where(d => d.STATUS > TaskStatus.新建)
+                                                         .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
+                                                         .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
+                                                         .GroupBy(d => d.TaskGroupKey).Count();
+                                    })
+                                    .ThenBy(v => v.CREATETIME)
+                                    .GroupBy(v => v.ADDRTO).ToArray();
+
+                            //获取两个个可执行任务,此时这两个任务的目标地址是一致的
+                            var tasks = outDepotList.GetSrmValidTaskList(db, obj).GetOutTask();
+
+                            #region 校验两个产品是否为同规格
+
+                            if (tasks.Length == 2)
                             {
-                                obj.WriteTask1(item, (short)tasks.Length);
+                                var length = tasks.OrderByDescending(v => v.Length).ToArray();
+                                //较大的长度减去较小的长度,差大于两百表示为不同规格产品
+                                if (length[0].Length - length[1].Length > 200)
+                                {
+                                    tasks = tasks.Take(1).ToArray();
+                                }
                             }
-                            else if (fork == SrmFork.货叉2) //列数较大的放二工位
+
+                            #endregion 校验两个产品是否为同规格
+
+                            for (int i = 0; i < tasks.Length; i++)
                             {
-                                obj.WriteTask2(item, (short)tasks.Length);
+                                var item = tasks[i];
+                                var task = db.Default.Set<WCS_TASK>().Find(item.ID);
+                                var oldTaskSTATUS = task.STATUS;
+                                task.STARTTIME = DateTime.Now;
+                                task.UPDATETIME = DateTime.Now;
+                                task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
+                                task.DEVICE = obj.Entity.CODE;
+                                task.TaskGroupKey = tasks.Length switch
+                                {
+                                    1 => $"{tasks[0].ID}_0",
+                                    2 => $"{tasks[0].ID}_{tasks[1].ID}",
+                                    _ => throw new WarnException($"可用任务数异常{tasks.Length}"),
+                                };
+                                var fork = obj.GetFork(item, i);
+                                //获取站台及下一个地址
+                                task.GetSrmStationAndaddNext(fork);
+                                var msg = "";
+                                if (fork == SrmFork.货叉1)
+                                    msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_1}-{obj.Data.SCol_1}-{obj.Data.SLayer_1}][{obj.Data.ELine_1}][{obj.Data.VoucherNo_1}]";
+                                else
+                                    msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_2}-{obj.Data.SCol_2}-{obj.Data.SLayer_2}][{obj.Data.ELine_2}][{obj.Data.VoucherNo_2}]";
+                                task.CreateStatusLog(db, msg, this.GetType());
+                                item.SRMSTATION = task.SRMSTATION;
+                                if (fork == SrmFork.货叉1) // 列数较小的放一工位
+                                {
+                                    obj.WriteTask1(item, (short)tasks.Length);
+                                }
+                                else if (fork == SrmFork.货叉2) //列数较大的放二工位
+                                {
+                                    obj.WriteTask2(item, (short)tasks.Length);
+                                }
+                                db.Default.SaveChanges();
                             }
-                            db.Default.SaveChanges();
-                        }
+                        });
                     });
 
                     #endregion 出库