Bladeren bron

分拣二南直接码垛

1693994901 6 maanden geleden
bovenliggende
commit
bd9f42f795

+ 19 - 7
YWGC/FJK/WCS.WorkEngineering/Systems/分拣支线/环形库分流点.cs

@@ -303,20 +303,26 @@ namespace WCS.WorkEngineering.Systems
                         }
 
                         #region 判断是否存在未结束码垛信息
-
+                        
                         var maDuoXinXiList = db.Queryable<BillRingPalletizingInfo>().Where(x => maDuoZhanTaiList.Contains(x.MaDuoGongWei) && x.Out == false).ToList();
                         if (!maDuoXinXiList.Any(x => x.BomCode == taskInfo.MatCode && x.HaveQty < x.HWCountQty)) //没有未结束的当前规格的码垛信息
                         {
                             //按照站台进行分组,找到一个没有分配过码垛任务的站台,或者是一个码垛任务数量较少的站台
                             var maDuoZhanTaiGroup = maDuoXinXiList.GroupBy(x => x.MaDuoGongWei).ToList();
                             var maDuoZhanTai = "";
+                            
                             if (maDuoZhanTaiGroup.Count == 1)
                             {
                                 //获取没有用到的码垛站台信息
                                 maDuoZhanTai = maDuoZhanTaiList.FirstOrDefault(x => !maDuoZhanTaiGroup.Any(m => x == m.Key));
                             }
-                            else
+                            else if (maDuoZhanTaiGroup.Count == 0)
                             {
+                                
+                                maDuoZhanTai = maDuoZhanTaiList.FirstOrDefault();
+                            }
+                            else
+                            {                               
                                 maDuoZhanTai = maDuoZhanTaiGroup.Select(x => new { x.Key, x.First().AddTime, Count = x.Count() })
                                .OrderBy(x => x.Count).ThenBy(x => x.AddTime).First().Key;
                             }
@@ -383,13 +389,13 @@ namespace WCS.WorkEngineering.Systems
                                     x.MatCode == taskInfo.MatCode).ToList();
                                 World.Log($"直接码垛埋点二.1,{maDuoXinXi.BomSetGrpId},{taskInfo.MatCode}");
                                 //取当前SKU在垛形明细中最小的一个坐标号 ,初始化时默认取第一个
-                                var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderBy(x => x).First());
+                                var lastXYNO = Convert.ToInt32(bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First());
                                 World.Log("直接码垛埋点三");
                                 if (cellMatCodeList.Any()) //货位中已有当前SKU的产品,取最大数 最大数表示最近入库的
                                 {
-                                    lastXYNO = cellMatCodeList.OrderByDescending(x => x.WmsTask).First().WmsTask;
-                                    var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x > lastXYNO)
-                                        .OrderBy(x => x).First();
+                                    lastXYNO = cellMatCodeList.OrderBy(x => x.WmsTask).First().WmsTask;
+                                    var xyNo = bomSetInfos.Select(x => Convert.ToInt32(x.XYNo)).Where(x => x < lastXYNO)
+                                        .OrderByDescending(x => x).First();
                                     World.Log("直接码垛埋点四");
                                     maDuoXinXi.LastXYNO = xyNo;
                                 }
@@ -589,6 +595,12 @@ namespace WCS.WorkEngineering.Systems
                 World.Log($"未找到对应垛型信息,请确认是否被禁用", LogLevelEnum.High);
                 return true;
             }
+
+            if (db.Queryable<BillRingPalletizingInfo>().NoLock().Any(x => x.WareHouseId == wareHouse.Id && x.BomSetGrpId != bomsetGrp.Id && x.Out == false))
+            {
+                World.Log($"当前环形库已有垛型在码垛,请等待", LogLevelEnum.High);
+                return true;
+            }
             var xyNo = db.Queryable<BillBomsetinfo>().NoLock().Where(x => x.BomSetHdrId == bomsetGrp.Id && x.IsEmpty == 0)
                 .ToList().Select(x => Convert.ToInt32(x.XYNo)).OrderByDescending(x => x).First();
 
@@ -602,7 +614,7 @@ namespace WCS.WorkEngineering.Systems
                 BomCode = bomsetGrp.BomCode,
                 HaveQty = 0,
                 Out = false,
-                LastXYNO = wareHouse.Code.Contains("N") ? xyNo + 1 : 0,
+                LastXYNO = wareHouse.Code.Contains("S") ? xyNo + 1 : 0,
                 MaDuoGongWei = maDuoGongWei
             };
 

+ 12 - 8
YWGC/FJK/WCS.WorkEngineering/Systems/环形库/机械臂cs.cs

@@ -208,6 +208,10 @@ namespace WCS.WorkEngineering.Systems
                         var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.Type == TaskType.SetPlate && v.Status == Entity.TaskStatus.FinishOfShunt && dev.Data2.TaskNumber == v.ID);
                         if (task == null) continue;
 
+                        if (db.Default.Queryable<WCS_TaskInfo>().Where(x => x.WmsTask == task.WmsTask && x.AddrTo == task.AddrTo && x.Status < TaskStatus.Finish).Count()>1)
+                        {
+                            throw new KnownException($"当前码垛编号与任务{task.ID}码垛编号重复,请联系工程师确认是否有误", LogLevelEnum.High);
+                        }
                         task.Status = Entity.TaskStatus.StackerExecution;
                         task.LastInteractionPoint = dev.Entity.Code;
                         task.SrmStation = dev.Entity.Code;
@@ -777,18 +781,18 @@ namespace WCS.WorkEngineering.Systems
                 "1042" => new List<string>()
                             {
                                 "1042",
-                                "1043",
-                                "1040",
-                                "1044",
-                                "1045"
+                                "1043"
+                                //"1040",
+                                //"1044",
+                                //"1045"
                             },
                 "1033" => new List<string>()
                             {
                                 "1033",
-                                "1034",
-                                "1031",
-                                "1035",
-                                "1036"
+                                "1034"
+                                //"1031",
+                                //"1035",
+                                //"1036"
                             },
                 "1024" => new List<string>()
                             {

+ 107 - 7
YWGC/FJK/WCS.WorkEngineering/Systems/环形库码垛结束.cs

@@ -1,4 +1,5 @@
-using ServiceCenter.Extensions;
+using NetTaste;
+using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using SqlSugar;
@@ -9,6 +10,7 @@ using WCS.Entity.Protocol.Protocol.Robot;
 using WCS.Entity.Protocol.Robot;
 using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.Model.WMS;
 using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.Worlds;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
@@ -27,28 +29,47 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Device<IStation520, IStation521, IStation523, IRobot530, IRobot531> obj)
         {
-            if (!obj.Data5.CmdType.HasFlag(RobotCmdType.End) && obj.Data4.CmdType != 0) obj.Data4.CmdType = 0;
+            var isForcedEnding = false;
+            SqlSugarHelper.Do(_db =>
+            {
+                var db = _db.Default;             
+                var code = $"ForcedEndStation{obj.Entity.Code}";
+                var isForcedEnd = db.Queryable<fjSysConfig>().NoLock().First(x => x.Code == code);
+                if (isForcedEnd != null && isForcedEnd.SContent.ToShort() == 1)
+                {
+                    isForcedEnding = true;
+                }
+            });
+            //强制结束不再判断机械臂是否给结束信号
+            if ((!obj.Data5.CmdType.HasFlag(RobotCmdType.End)) && obj.Data4.CmdType != 0) obj.Data4.CmdType = 0;
             if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) return;
-            if (!obj.Data5.CmdType.HasFlag(RobotCmdType.End)) return;
-            if (obj.Data5.MaxQuantity != obj.Data5.Quantity || obj.Data5.Quantity == 0 || obj.Data5.MaxQuantity == 0) throw new KnownException($"码垛数量异常:最大码垛数量[{obj.Data5.MaxQuantity}]已码数量{obj.Data5.Quantity}", LogLevelEnum.High);
+            if (!obj.Data5.CmdType.HasFlag(RobotCmdType.End) && !isForcedEnding) return;
+            if ((obj.Data5.MaxQuantity != obj.Data5.Quantity || obj.Data5.Quantity == 0 || obj.Data5.MaxQuantity == 0)&& !isForcedEnding) throw new KnownException($"码垛数量异常:最大码垛数量[{obj.Data5.MaxQuantity}]已码数量{obj.Data5.Quantity}", LogLevelEnum.High);
             WCS_TaskInfo task = null;
+
+            
             //找到对应的码垛数据
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
                 var taskNoList = obj.Data5.GetTaskNoList().ToList();
                 var tasks = db.Queryable<WCS_TaskInfo>().RowLock().Where(x => taskNoList.Contains(x.ID) && x.Status == TaskStatus.ConveyorExecution).ToList();
-                if (tasks.Count() > 0 && tasks.Count() != obj.Data5.MaxQuantity)
+              
+                if (tasks.Count() > 0 && tasks.Count() != obj.Data5.MaxQuantity && !isForcedEnding)
                 {
                     World.Log($"任务数量{tasks.Count()}-最大码垛数量{obj.Data5.MaxQuantity}");
                     return;
                 }
+
+                //获取id值用于直接码垛判断
+                var taskGroup = tasks.First().Type == TaskType.SetPlate ? tasks.First().TaskGroupKey : "";                
                 var deliveryTask = db.Queryable<WCS_TaskInfo>().RowLock().Single(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code && x.Status >= TaskStatus.RgvExecution && x.Status < TaskStatus.Finish) ?? throw new KnownException($"未找到当前站台对应的托盘搬运任务", LogLevelEnum.High);
                 var taskInfo = db.Queryable<WCS_TaskInfo>().RowLock().Single(x => x.Status == TaskStatus.WaitingToExecute && x.AddrFrom == obj.Entity.Code && x.Type == TaskType.EnterDepot);
                 if (deliveryTask.Status != TaskStatus.RgvCompleted) throw new KnownException($"搬运任务状态异常:{deliveryTask.ID}", LogLevelEnum.High);
                 if (taskInfo == null)
                 {
                     var task = db.Queryable<WCS_TaskInfo>().NoLock().Single(x => x.Status <= TaskStatus.RgvExecution && x.AddrFrom == obj.Entity.Code && x.Type == TaskType.EnterDepot);
+                    
                     if (task != null)
                     {
                         World.Log($"环线库码垛工位[{obj.Entity.Code}]存在状态为[{task.Status.GetDescription()}]的任务,任务号是[{task.ID}].请找到此任务确认并进行处理");
@@ -59,14 +80,82 @@ namespace WCS.WorkEngineering.Systems
                     try
                     {
                         //开始绑盘
-                        WmsApi.FinishBingPallet(cbrCode.BarCode, tasks.Select(x => x.BarCode).ToList(), obj.Entity.Code.GetWareCode(), obj.Entity.Code, obj.Entity.Parent.Code);
+                        var res = WmsApi.FinishBingPallet(cbrCode.BarCode, tasks.Select(x => x.BarCode).ToList(), obj.Entity.Code.GetWareCode(), obj.Entity.Code, obj.Entity.Parent.Code);
+                        if (!string.IsNullOrEmpty(taskGroup) && res.ResCode == WebApi.Models.WMS.Response.ResponseStatusCodeEnum.Sucess)
+                        {
+                            var ringPallet = db.Queryable<BillRingPalletizingInfo>().First(x => x.Id.ToString() == taskGroup && x.Out == false);
+                            if (ringPallet != null)
+                            { 
+                                ringPallet.Out = true;
+                                db.UpdateableRowLock(ringPallet).UpdateColumns(x => new { x.Out }).ExecuteCommand();
+                            }
+                            //UpdateScontent(db, obj.Entity.Code);
+
+                            //foreach (var item in tasks)
+                            //{
+                            //    item.Status = TaskStatus.Finish;
+                            //    item.EndTime = DateTime.Now;
+                            //    db.UpdateableRowLock(item).UpdateColumns(x => new { x.Status, x.EndTime }).ExecuteCommand();
+                            //    item.AddWCS_TASK_DTL(db, obj.Entity.Code, "任务结束");
+                            //}
+                            //deliveryTask.Status = TaskStatus.Finish;
+                            //deliveryTask.EndTime = DateTime.Now;
+                            //db.UpdateableRowLock(deliveryTask).UpdateColumns(x => new { x.Status, x.EndTime }).ExecuteCommand();
+                            //deliveryTask.AddWCS_TASK_DTL(db, obj.Entity.Code, $"任务结束");
+                            //var dev1 = DevicePath.GetPath(obj.Entity.Code, "SRM").Points.Last();
+                            //taskInfo.Status = TaskStatus.ConveyorExecution;
+                            //taskInfo.WarehouseCode = dev1.Code.GetWareCode();
+                            //db.UpdateableRowLock(taskInfo).UpdateColumns(x => new { x.Status, x.WarehouseCode }).ExecuteCommand();
+                            //taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, $"更新任务对应仓库信息{taskInfo.WarehouseCode}");
+
+                            //task = taskInfo;
+                            //if (task == null) return;
+                            //obj.Data.TaskNumber = task.ID;
+                            //obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+                            //obj.Data.GoodsEnd = task.AddrNext.ToShort();
+                            //obj.Data4.CmdType = RobotCmdType.End;
+                        }                                               
                     }
                     catch (Exception e)
                     {
                         World.Log($"{e.Message}");
                         try
                         {
-                            WmsApi.BingPallet(cbrCode.BarCode, tasks.Select(x => x.BarCode).ToList(), obj.Entity.Code.GetWareCode(), obj.Entity.Code, obj.Entity.Parent.Code);
+                            var res = WmsApi.BingPallet(cbrCode.BarCode, tasks.Select(x => x.BarCode).ToList(), obj.Entity.Code.GetWareCode(), obj.Entity.Code, obj.Entity.Parent.Code);
+                            if (!string.IsNullOrEmpty(taskGroup) && res.ResCode == WebApi.Models.WMS.Response.ResponseStatusCodeEnum.Sucess)
+                            {
+                                var ringPallet = db.Queryable<BillRingPalletizingInfo>().First(x => x.Id.ToString() == taskGroup && x.Out == false);
+                                if (ringPallet != null)
+                                {
+                                    ringPallet.Out = true;
+                                    db.UpdateableRowLock(ringPallet).UpdateColumns(x => new { x.Out }).ExecuteCommand();
+                                }
+                                //UpdateScontent(db, obj.Entity.Code);
+
+                                //foreach (var item in tasks)
+                                //{
+                                //    item.Status = TaskStatus.Finish;
+                                //    item.EndTime = DateTime.Now;
+                                //    db.UpdateableRowLock(item).UpdateColumns(x => new { x.Status, x.EndTime }).ExecuteCommand();
+                                //    item.AddWCS_TASK_DTL(db, obj.Entity.Code, "任务结束");
+                                //}
+                                //deliveryTask.Status = TaskStatus.Finish;
+                                //deliveryTask.EndTime = DateTime.Now;
+                                //db.UpdateableRowLock(deliveryTask).UpdateColumns(x => new { x.Status, x.EndTime }).ExecuteCommand();
+                                //deliveryTask.AddWCS_TASK_DTL(db, obj.Entity.Code, $"任务结束");
+                                //var dev2 = DevicePath.GetPath(obj.Entity.Code, "SRM").Points.Last();
+                                //taskInfo.Status = TaskStatus.ConveyorExecution;
+                                //taskInfo.WarehouseCode = dev2.Code.GetWareCode();
+                                //db.UpdateableRowLock(taskInfo).UpdateColumns(x => new { x.Status, x.WarehouseCode }).ExecuteCommand();
+                                //taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, $"更新任务对应仓库信息{taskInfo.WarehouseCode}");
+
+                                //task = taskInfo;
+                                //if (task == null) return;
+                                //obj.Data.TaskNumber = task.ID;
+                                //obj.Data.GoodsStart = obj.Entity.Code.ToShort();
+                                //obj.Data.GoodsEnd = task.AddrNext.ToShort();
+                                //obj.Data4.CmdType = RobotCmdType.End;
+                            }                            
                         }
                         catch (Exception exception)
                         {
@@ -103,6 +192,17 @@ namespace WCS.WorkEngineering.Systems
             obj.Data4.CmdType = RobotCmdType.End;
         }
 
+        public void UpdateScontent(SqlSugarScopeProvider db,string device)
+        {
+            var code = $"ForcedEndStation{device}";
+            var isForcedEnd = db.Queryable<fjSysConfig>().NoLock().First(x => x.Code == code);
+            if (isForcedEnd != null && isForcedEnd.SContent.ToShort() == 1)
+            {
+                isForcedEnd.SContent = "0";
+                db.UpdateableRowLock(isForcedEnd).UpdateColumns(x => new { x.SContent }).ExecuteCommand();
+            }
+        }
+
         public override bool Select(Device dev)
         {
             return dev.HasFlag(DeviceFlags.环形库码垛工位);