林豪 左 1 рік тому
батько
коміт
bcf518ee48

+ 6 - 0
业务工程/分拣库/WCS.Entity.Protocol/Truss/ITruss530.cs

@@ -379,6 +379,12 @@ namespace WCS.Entity.Protocol.Truss
         [Description("最大码垛数量")]
         public short MaxQuantity { get; set; }
 
+        /// <summary>
+        ///  最大码垛数量
+        /// </summary>
+        [Description("最大码垛数量")]
+        public short Quantity { get; set; }
+
         /// <summary>
         ///  码垛结束
         /// </summary>

+ 4 - 1
业务工程/分拣库/WCS.Entity.Protocol/Truss/WCS_Truss530.cs

@@ -194,9 +194,12 @@ namespace WCS.Entity.Protocol.Truss
         public short MaxQuantity { get; set; }
 
         [DataMember(Order = 62)]
-        public TrussCmdType CmdType { get; set; }
+        public short Quantity { get; set; }
 
         [DataMember(Order = 63)]
+        public TrussCmdType CmdType { get; set; }
+
+        [DataMember(Order = 64)]
         public short VoucherNo { get; set; }
     }
 }

+ 249 - 1
业务工程/分拣库/WCS.WorkEngineering/Extensions/TaskExtension.cs

@@ -4,7 +4,6 @@ using ServiceCenter.Redis;
 using ServiceCenter.SqlSugars;
 using SqlSugar;
 using WCS.Entity;
-using wms.sqlsugar.model.fj;
 using TaskStatus = WCS.Entity.TaskStatus;
 
 namespace WCS.WorkEngineering.Extensions
@@ -361,4 +360,253 @@ namespace WCS.WorkEngineering.Extensions
         /// </summary>
         public bool Finish { get; set; }
     }
+
+    /// <summary>
+    /// 垛型明细表
+    /// </summary>
+    [SugarTable("Bill_BomSetInfo", tableDescription: "垛型明细表")]
+    public partial class BillBomsetinfo
+    {
+        /// <summary>
+        ///  ID
+        /// </summary>
+        [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, ColumnDescription = "ID")]
+        public virtual long Id { get; set; }
+
+        /// <summary>
+        ///  备注
+        /// </summary>
+        [SugarColumn(ColumnName = "Memo", Length = 500, IsNullable = true, ColumnDataType = "nvarchar", DefaultValue = "", ColumnDescription = "备注")]
+        public virtual string Memo { get; set; }
+
+        /// <summary>
+        ///  创建用户
+        /// </summary>
+        [SugarColumn(ColumnName = "AddWho", Length = 50, ColumnDataType = "nvarchar", DefaultValue = "", IsNullable = false, ColumnDescription = "创建用户")]
+        public virtual string AddWho { get; set; } = "";
+
+        /// <summary>
+        ///  更新用户
+        /// </summary>
+        [SugarColumn(ColumnName = "EditWho", Length = 50, ColumnDataType = "nvarchar", DefaultValue = "", IsNullable = false, ColumnDescription = "更新用户")]
+        public virtual string EditWho { get; set; } = "";
+
+        /// <summary>
+        ///  创建时间
+        /// </summary>
+        [SugarColumn(ColumnName = "AddTime", DefaultValue = "1900-1-1", IsNullable = false, ColumnDescription = "创建时间")]
+        public virtual DateTime AddTime { get; set; } = DateTime.Now;
+
+        /// <summary>
+        /// 更新时间
+        /// </summary>
+        [SugarColumn(ColumnName = "EditTime", DefaultValue = "1900-1-1", IsNullable = false, ColumnDescription = "更新时间")]
+        public virtual DateTime EditTime { get; set; } = DateTime.Now;
+
+        /// <summary>
+        /// 垛型id
+        /// </summary>
+        [SugarColumn(ColumnDataType = "bigint", IsNullable = false, ColumnDescription = "垛型id")]
+        public long BomSetHdrId { get; set; }
+
+        /// <summary>
+        /// 是否停用
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "是否停用")]
+        public int IsStop { get; set; }
+
+        /// <summary>
+        /// 是否空置
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "是否空置")]
+        public int IsEmpty { get; set; }
+
+        /// <summary>
+        /// 坐标号
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = false, ColumnDescription = "坐标号")]
+        public string XYNo { get; set; }
+
+        /// <summary>
+        /// 物料id
+        /// </summary>
+        [SugarColumn(ColumnDataType = "bigint", ColumnDescription = "物料id")]
+        public long MatId { get; set; }
+
+        /// <summary>
+        /// 物料编码
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", IsNullable = true, Length = 50, ColumnDescription = "物料编码")]
+        public string MatCode { get; set; }
+
+        /// <summary>
+        /// 正反面
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = true, ColumnDescription = "正反面")]
+        public int SideNum { get; set; }
+
+        /// <summary>
+        /// 工字轮类型
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true, ColumnDescription = "工字轮类型")]
+        public string SpoolType { get; set; }
+
+        /// <summary>
+        /// 钢丝类型
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = true, ColumnDescription = "钢丝类型")]
+        public string SilkType { get; set; }
+
+        /// <summary>
+        /// 钢丝直径
+        /// </summary>
+        [SugarColumn(ColumnDataType = "decimal", Length = 18, IsNullable = true, ColumnDescription = "钢丝直径")]
+        public decimal SilkDiam { get; set; }
+
+        /// <summary>
+        /// 钢丝直径上限
+        /// </summary>
+        [SugarColumn(ColumnDataType = "decimal", Length = 18, IsNullable = true, ColumnDescription = "钢丝直径上限")]
+        public decimal SilkDiamMaxCount { get; set; }
+
+        /// <summary>
+        /// 数量上限
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = true, ColumnDescription = "数量上限")]
+        public int QtyMaxCount { get; set; }
+
+        /// <summary>
+        /// 是否芯股
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "是否芯股")]
+        public int IsCore { get; set; }
+
+        /// <summary>
+        /// 09垛型里面的行(1-12)
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = true, ColumnDescription = "09垛型里面的行(1-12)")]
+        public int Row { get; set; }
+
+        /// <summary>
+        /// 是否混合料行(09垛型使用,1是0否)
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "是否混合料行(09垛型使用,1是0否)")]
+        public int IsMixRow { get; set; }
+
+        /// <summary>
+        /// 混合料行编码
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", IsNullable = true, Length = 50, ColumnDescription = "混合料行编码")]
+        public string MixRowCode { get; set; }
+
+        /// <summary>
+        ///  第一种第二种第三种
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "第一种第二种第三种")]
+        public int CategoryId { get; set; }
+    }
+
+    /// <summary>
+    ///  垛形主表
+    /// </summary>
+    [Tenant("fj")]
+    [SugarTable("Bill_BomSetGrp", tableDescription: "垛形主表")]
+    public partial class BillBomsetgrp
+    {
+        /// <summary>
+        ///  ID
+        /// </summary>
+        [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, ColumnDescription = "ID")]
+        public virtual long Id { get; set; }
+
+        /// <summary>
+        ///  备注
+        /// </summary>
+        [SugarColumn(ColumnName = "Memo", Length = 500, IsNullable = true, ColumnDataType = "nvarchar", DefaultValue = "", ColumnDescription = "备注")]
+        public virtual string Memo { get; set; }
+
+        /// <summary>
+        ///  创建用户
+        /// </summary>
+        [SugarColumn(ColumnName = "AddWho", Length = 50, ColumnDataType = "nvarchar", DefaultValue = "", IsNullable = false, ColumnDescription = "创建用户")]
+        public virtual string AddWho { get; set; } = "";
+
+        /// <summary>
+        ///  更新用户
+        /// </summary>
+        [SugarColumn(ColumnName = "EditWho", Length = 50, ColumnDataType = "nvarchar", DefaultValue = "", IsNullable = false, ColumnDescription = "更新用户")]
+        public virtual string EditWho { get; set; } = "";
+
+        /// <summary>
+        ///  创建时间
+        /// </summary>
+        [SugarColumn(ColumnName = "AddTime", DefaultValue = "1900-1-1", IsNullable = false, ColumnDescription = "创建时间")]
+        public virtual DateTime AddTime { get; set; } = DateTime.Now;
+
+        /// <summary>
+        /// 更新时间
+        /// </summary>
+        [SugarColumn(ColumnName = "EditTime", DefaultValue = "1900-1-1", IsNullable = false, ColumnDescription = "更新时间")]
+        public virtual DateTime EditTime { get; set; } = DateTime.Now;
+
+        /// <summary>
+        /// 是否停用
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "是否停用")]
+        public int IsStop { get; set; }
+
+        /// <summary>
+        /// 垛型编码
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = false, ColumnDescription = "垛型编码")]
+        public string Code { get; set; }
+
+        /// <summary>
+        ///  短垛型编码
+        /// </summary>
+        [SugarColumn(ColumnDataType = "smallint", IsNullable = false, ColumnDescription = "短垛型编码")]
+        public short ShortCode { get; set; }
+
+        /// <summary>
+        /// 垛型名称
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 100, IsNullable = false, ColumnDescription = "垛型名称")]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// BomCode(投料信息)
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 200, IsNullable = false, ColumnDescription = "BomCode(投料信息)")]
+        public string BomCode { get; set; }
+
+        /// <summary>
+        /// 帘线物料编码
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = false, ColumnDescription = "帘线物料编码")]
+        public string ProMaterCode { get; set; }
+
+        /// <summary>
+        /// 工字轮个数
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "工字轮个数")]
+        public int HWCountQty { get; set; }
+
+        /// <summary>
+        /// 托盘类型
+        /// </summary>
+        [SugarColumn(ColumnDataType = "nvarchar", Length = 50, IsNullable = false, ColumnDescription = "托盘类型")]
+        public string TpTypeCode { get; set; }
+
+        /// <summary>
+        /// 层数
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = false, ColumnDescription = "层数")]
+        public int LayerCountQty { get; set; }
+
+        /// <summary>
+        /// 垛型大类
+        /// </summary>
+        [SugarColumn(ColumnDataType = "int", IsNullable = true, ColumnDescription = "垛型大类")]
+        public int StampType { get; set; }
+    }
 }

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/RGVSystems.cs

@@ -274,7 +274,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override bool Select(Device dev)
         {
-            return dev.Code is /*"RGV1" or "RGV2" or*/ "RGV3" or "RGV4" or "RGV5" or "RGV6";
+            return dev.Code is /*"RGV1" or "RGV2" or*/ /*"RGV3" or*/ "RGV4" /*or "RGV5" or "RGV6"*/;
             //return dev.HasFlag(Extensions.DeviceFlags.RGV);
         }
     }

+ 6 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/SrmSystems.cs

@@ -19,7 +19,7 @@ namespace WCS.WorkEngineering.Systems
     /// <summary>
     /// 堆垛机系统
     /// </summary>
-    //[BelongTo(typeof(SrmWorld))]
+    [BelongTo(typeof(SrmWorld))]
     [Description("堆垛机系统")]
     public class SrmSystems : DeviceSystem<SRM>
     {
@@ -90,6 +90,11 @@ namespace WCS.WorkEngineering.Systems
                             break;
 
                         case TaskType.OutDepot:
+                            var devs = new List<string>() { };
+                            if ()
+                            {
+
+                            }
                             switch (task.OutType)
                             {
                                 case OutTypeEnum.自动出库任务 or OutTypeEnum.全自动手动出库任务:

+ 64 - 16
业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/桁架分流点.cs

@@ -1,4 +1,5 @@
-using PlcSiemens.Core.Extension;
+using Newtonsoft.Json;
+using PlcSiemens.Core.Extension;
 using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
@@ -132,14 +133,14 @@ namespace WCS.WorkEngineering.Systems
                 var palletizing = db.Queryable<WCS_Palletizing>()
                     .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
                     .Where(x => !x.Finish && x.WarehouseCode == taskInfo.WarehouseCode && x.Layers.Any(l => l.Rows.Any(r => r.Finish)))
-                    .Where(x => x.AddTime < endTime).ToList()
+                    .Where(x => x.EditTime < endTime).ToList()
                     .MinBy(x => x.AddTime);
                 cacheLineList = db.Queryable<WCS_CacheLine>().Where(x => x.WarehouseCode == taskInfo.WarehouseCode && x.IsTruss).ToList();
 
-                if (palletizing != null && cacheLineList.Any())
+                if (palletizing != null && !cacheLineList.Any())
                 {
                     var dev = Device.All.Where(x => x.Code == palletizing.PalletizingStation).Select(x => new Device<ITruss530>(x, World)).FirstOrDefault();
-                    if (dev != null)
+                    if (dev != null && !dev.Data.CmdType.HasFlag(TrussCmdType.Two))
                     {
                         dev.Data.CmdType = TrussCmdType.Two;
                     }
@@ -151,7 +152,8 @@ namespace WCS.WorkEngineering.Systems
             //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配,当前任务的仓库号必须要等于码垛信息绑定的仓库号
             var palletizingList = db.Queryable<WCS_Palletizing>()
                 .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
-                .Where(x => !x.Finish && x.MatCodeList.Contains(taskInfo.MatCode) && x.WarehouseCode == taskInfo.WarehouseCode)
+                .Includes(x => x.TaskInfo)
+                .Where(x => (!x.Finish || (x.Finish && x.isItHalf && x.TaskInfo == null)) && x.MatCodeList.Contains(taskInfo.MatCode) && x.WarehouseCode == taskInfo.WarehouseCode)
                 .OrderBy(x => x.AddTime)
                 .ToList();
 
@@ -196,20 +198,63 @@ namespace WCS.WorkEngineering.Systems
                 palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
                 palletizingRow.CacheLineId = res.Id;
                 palletizingRow.EditTime = DateTime.Now;
-                db.Updateable(palletizingRow).ExecuteCommand();
 
-                for (var i = 0; i < palletizingRow.Locs.Count; i++)
+                var createCacheLoc = palletizingRow.Locs.Select((t, i) => new WCS_CacheLineLoc()
+                {
+                    XYNo = t.XYNo,
+                    InStock = i == 0,
+                    IsEmpty = t.IsEmpty,
+                    MatCode = t.MatCode,
+                    TaskId = i == 0 ? taskInfo.ID : 0,
+                    CacheLineId = res.Id
+                }).ToList();
+
+                if (palletizing.isItHalf) //当前任务被分配到了二次码垛托盘上了。
                 {
-                    var loc = new WCS_CacheLineLoc()
+                    var twoDevCode = new List<string>();
+                    switch (obj.Entity.Code)
+                    {
+                        case "455":
+                            twoDevCode.AddRange(new List<string>() { "", "" });
+                            break;
+
+                        case "655":
+                            twoDevCode.AddRange(new List<string>() { "", "" });
+                            break;
+
+                        case "855":
+                            twoDevCode.AddRange(new List<string>() { "", "" });
+                            break;
+
+                        case "1055":
+                            twoDevCode.AddRange(new List<string>() { "", "" });
+                            break;
+
+                        case "1255":
+                            twoDevCode.AddRange(new List<string>() { "", "" });
+                            break;
+
+                        case "1455":
+                            twoDevCode.AddRange(new List<string>() { "", "" });
+                            break;
+                    }
+                    //找到一个对应的空置码垛位
+                    var twoDevs = Device.All.Where(x => twoDevCode.Contains(x.Code)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).Where(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status)).Select(x => x.Entity.Code);
+                    if (!twoDevs.Any())
+                    {
+                        World.Log("无可用的二次码垛工位");
+                        continue;
+                    }
+
+                    if (db.Queryable<WCS_Palletizing>().Any(x => !x.Finish && twoDevs.Contains(x.PalletizingStation)))
                     {
-                        XYNo = palletizingRow.Locs[i].XYNo,
-                        InStock = i == 0,
-                        IsEmpty = palletizingRow.Locs[i].IsEmpty,
-                        MatCode = palletizingRow.Locs[i].MatCode,
-                        TaskId = i == 0 ? taskInfo.ID : 0,
-                        CacheLineId = res.Id
-                    };
-                    db.Insertable(loc).ExecuteCommand();
+                        World.Log($"有正目标地址是{JsonConvert.SerializeObject(twoDevs)}的未结束二次码垛任务,无可用的二次码垛工位");
+                        continue;
+                    }
+                    palletizing.EditTime = DateTime.Now;
+                    palletizing.Finish = false;
+                    palletizing.PalletizingStation = twoDevs.FirstOrDefault();
+                    db.Updateable(palletizing).ExecuteCommand();
                 }
 
                 taskInfo.Status = TaskStatus.FinishOfShunt;
@@ -218,6 +263,9 @@ namespace WCS.WorkEngineering.Systems
                 taskInfo.EditTime = DateTime.Now;
                 db.Updateable(taskInfo).ExecuteCommand();
                 taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
+                db.Updateable(palletizingRow).ExecuteCommand();
+                db.Insertable(createCacheLoc).ExecuteCommand();
+
                 result = true;
             }
 

+ 26 - 0
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/创建二次码垛出库任务.cs

@@ -0,0 +1,26 @@
+using System.ComponentModel;
+using WCS.Core;
+using WCS.Entity.Protocol.Station;
+using WCS.WorkEngineering.Worlds;
+
+namespace WCS.WorkEngineering.Systems.桁架码垛
+{
+    [BelongTo(typeof(NoInteractionWorld))]
+    [Description("创建二次码垛出库任务")]
+    public class 创建二次码垛出库任务 : DeviceSystem<Device<IStation520>>
+    {
+        protected override bool ParallelDo => true;
+
+        protected override bool SaveLogsToFile => true;
+
+        public override void Do(Device<IStation520> obj)
+        {
+            //var 
+        }
+
+        public override bool Select(Device dev)
+        {
+            return dev.Code == nameof(创建二次码垛出库任务);
+        }
+    }
+}

+ 13 - 6
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架.cs

@@ -34,6 +34,8 @@ namespace WCS.WorkEngineering.Systems
             if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
             if (obj.Data2.CmdType == 1)
             {
+                var isFinish = false;
+
                 SqlSugarHelper.Do(_db =>
                 {
                     var db = _db.Default;
@@ -75,16 +77,19 @@ namespace WCS.WorkEngineering.Systems
                         deleteCacheLine.Add(cacheLine);
                     }
                     //更新层数据
-                    var layerId = palletizingRow.FirstOrDefault().PalletizingLayerId;
-                    var layer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows).Single(x => x.Id == layerId);
-                    if (!layer.Rows.All(x => x.Finish)) return;
-                    layer.Finish = true;
 
                     db.Updateable(upDateableLoc).ExecuteCommand();
                     db.Deleteable(deleteLoc).ExecuteCommand();
                     db.Updateable(upDateableRow).ExecuteCommand();
                     db.Deleteable(deleteCacheLine).ExecuteCommand();
-                    db.Updateable(layer).ExecuteCommand();
+
+                    var layerId = palletizingRow.FirstOrDefault().PalletizingLayerId;
+                    var layer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows).Single(x => x.Id == layerId);
+                    if (layer.Rows.All(x => x.Finish || x.IsEmpty))
+                    {
+                        layer.Finish = true;
+                        db.Updateable(layer).ExecuteCommand();
+                    }
 
                     //码垛完成后开始绑定托盘
                     var palletizingId = upDateableRow.First().Palletizing.Id;
@@ -92,9 +97,11 @@ namespace WCS.WorkEngineering.Systems
                     palletizing.EditTime = DateTime.Now;
                     db.Updateable(palletizing).ExecuteCommand();
                     var taskId = upDateableRow.SelectMany(x => x.Locs).Select(x => x.TaskId).ToList();
-                    var taskList = db.Queryable<WCS_TaskInfo>().Where(x => taskId.Any(t => t == x.ID)).Select(x => x.BarCode).ToList();
+                    var taskList = db.Queryable<WCS_TaskInfo>().Where(x => taskId.Contains(x.ID)).Select(x => x.BarCode).ToList();
                     var res = WmsApi.BingPallet(palletizing.PalleCode, taskList, palletizing.WarehouseCode, palletizing.PalletizingStation);
+                    isFinish = true;
                 });
+                if (!isFinish) throw new KnownException($"绑盘失败", LogLevelEnum.High);
 
                 obj.Data.CmdType = 1;
 

+ 12 - 12
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛区补空托盘任务生成.cs

@@ -47,12 +47,12 @@ namespace WCS.WorkEngineering.Systems
 
                 var addrFromCode = palletizingInfo.WarehouseCode switch
                 {
-                    "1N" => "1606",
-                    "1S" => "1616",
-                    "2N" => "1626",
-                    "2S" => "1636",
-                    "3N" => "1646",
-                    "3S" => "1656",
+                    "1N" => "1602",
+                    "1S" => "1612",
+                    "2N" => "1622",
+                    "2S" => "1632",
+                    "3N" => "1642",
+                    "3S" => "1652",
                     _ => "9999"
                 };
 
@@ -66,12 +66,12 @@ namespace WCS.WorkEngineering.Systems
             if (palletizing == null) return;
             var addrFromCode = palletizing.WarehouseCode switch
             {
-                "1N" => "1606",
-                "1S" => "1616",
-                "2N" => "1626",
-                "2S" => "1636",
-                "3N" => "1646",
-                "3S" => "1656",
+                "1N" => "1602",
+                "1S" => "1612",
+                "2N" => "1622",
+                "2S" => "1632",
+                "3N" => "1642",
+                "3S" => "1652",
                 _ => "9999"
             };
             var dev = Device.All.Where(x => x.Code == addrFromCode).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();

+ 9 - 5
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛工位任务结束处理.cs

@@ -27,7 +27,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Device<IStation520, IStation521, IStation523, ITruss530, ITruss531> obj)
         {
-            if (!obj.Data5.CmdType.HasFlag(TrussCmdType.End)) obj.Data4.CmdType = 0;
+            if (!obj.Data5.CmdType.HasFlag(TrussCmdType.End) && !obj.Data4.CmdType.HasFlag(TrussCmdType.End1 | TrussCmdType.Two)) obj.Data4.CmdType = 0;
             if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) return;
             if (!obj.Data5.CmdType.HasFlag(TrussCmdType.End)) return;
             if (!obj.Data5.CmdType.HasFlag(TrussCmdType.End1))
@@ -51,23 +51,27 @@ namespace WCS.WorkEngineering.Systems
                 var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.BarCode == palletizing.PalleCode && x.Type == TaskType.EnterDepot && x.Status == TaskStatus.WaitingToExecute);
                 if (taskInfo == null)
                 {
-                    if (obj.Data5.CmdType.HasFlag(TrussCmdType.End1)) WmsApi.ForceFinishBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
-                    else if (obj.Data5.CmdType.HasFlag(TrussCmdType.Two)) WmsApi.SecondaryBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
+                    if (obj.Data5.CmdType.HasFlag(TrussCmdType.Two)) WmsApi.SecondaryBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
+                    else if (obj.Data5.CmdType.HasFlag(TrussCmdType.End1)) WmsApi.ForceFinishBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
                     else WmsApi.FinishBingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
                     return;
                 }
                 if (taskInfo.Status != TaskStatus.WaitingToExecute) return;
 
-                Parallel.ForEach(taskList, x =>
+                foreach (var x in taskList)
                 {
                     x.Status = TaskStatus.Finish;
                     x.EndTime = DateTime.Now;
                     db.Updateable(x).ExecuteCommand();
                     x.AddWCS_TASK_DTL(db, obj.Entity.Code, "任务结束");
-                });
+                }
 
                 palletizing.Finish = true;
                 palletizing.isItHalf = obj.Data5.CmdType.HasFlag(TrussCmdType.Two);
+                if (palletizing.isItHalf)
+                {
+                    palletizing.TaskId = taskInfo.ID; //如果是半托入库,需要把绑定的任务切换成入库任务
+                }
                 db.Updateable(palletizing).ExecuteCommand();
                 taskInfo.Status = TaskStatus.ConveyorExecution;
                 db.Updateable(taskInfo).ExecuteCommand();

+ 3 - 2
业务工程/分拣库/WCS.WorkEngineering/WorkStart.cs

@@ -10,6 +10,7 @@ using WCS.Entity.Protocol.Station;
 using WCS.Entity.Protocol.Truss;
 using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.Systems;
+using WCS.WorkEngineering.Systems.桁架码垛;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 
 namespace WCS.WorkEngineering
@@ -27,7 +28,7 @@ namespace WCS.WorkEngineering
         {
             #region 无交互触发设备
 
-            var devs = new List<string>() { nameof(分线计算09), nameof(桁架码垛区补空托盘任务生成), "出库AGV", "入库AGV", nameof(NoInteractionSystems), nameof(UpLoadSystems) };
+            var devs = new List<string>() { nameof(分线计算09), nameof(桁架码垛区补空托盘任务生成), "出库AGV", "入库AGV", nameof(NoInteractionSystems), nameof(UpLoadSystems), nameof(创建二次码垛出库任务) };
             foreach (var conv in devs.Select(code => new Device(code)))
             {
                 conv.AddProtocol<IStation520>(0, 520, "1");
@@ -365,7 +366,7 @@ namespace WCS.WorkEngineering
                     {
                         conv!.AddProtocol<ITruss530>(db530, 530, item.Item1);
                         conv!.AddProtocol<ITruss531>(db531, 531, item.Item1);
-                        db530 += 8;
+                        db530 += 18;
                         db531 += 250;
                     }
                     else