Explorar el Código

优化出库数量管控

林豪 左 hace 3 años
padre
commit
437af42bf2
Se han modificado 1 ficheros con 17 adiciones y 16 borrados
  1. 17 16
      Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

+ 17 - 16
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -259,29 +259,30 @@ namespace WCS.Service.Works.SRM
                         //月台所有设备当前有的任务号
                         var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
                         //堆垛机设备
-                        var sc = obj.Entity.CODE;
+                        var srm = obj.Entity.CODE;
                         DB.Do(db =>
                         {
                             //堆垛机当前是否有正在执行的任务
-                            if (db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == sc && d.STATUS == TaskStatus.堆垛机执行))
+                            if (db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行))
                                 throw new WarnException($"[{deviceCode}]有正在执行的出库任务");
                             //找出等待执行的出库任务
-                            var q = db.Default.Set<WCS_TASK>().Where(v => v.STATUS == TaskStatus.新建)
-                                                              .Where(v => v.DEVICE == sc)
+                            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 == sc && d.STATUS == TaskStatus.堆垛机执行)).ToList();
-                            //同一个目标地址同时只能有4(双工位,每一节设备可以存放两个任务)个正在执行的任务
-                            //考虑到有可能出现一次只发一个任务的情况,因此判断条件为3
-                            //连续两次只发一个任务的情况暂时不考虑
+                                                              .Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)).ToList();
+                            //同一个目标地址同时只能有两组正在执行的任务
                             //同时对结果进行排序,分组后取第一组任务
-                            //TODO:暂时不确定排序后进行分组是否会完全打乱排序,先按照这种按时执行,后续有异常再更改
-                            //TODO:暂时维考虑二楼环穿
-                            var outDepot = q.Where(v => db.Default.Set<WCS_TASK>()
-                                                .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)
-                                                .Count() < 3)
+                            var outDepot = waitTask.Where(v =>
+                                                    {
+                                                        var max = v.ADDRTO == "G1340" ? 4 : 2;
+                                                        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 => v.CREATETIME)