xu.lu 3 years ago
parent
commit
dac0e7bae7

+ 2 - 1
Projects/永冠OPP/WCS.Service/Helpers/FinishTaskList.cs

@@ -1,5 +1,6 @@
 using System.Collections.Generic;
 using System.Linq;
+using System.Security.Policy;
 using WCS.Service.Entity;
 using WCS.Service.Extensions;
 using WCS.Service.Log;
@@ -92,6 +93,6 @@ namespace WCS.Service.Helpers
                 _ => throw new WarnException($"一组任务数量最大为2,当前{items.Length}"),
             };
             return infos;
-        }
+        }    
     }
 }

+ 64 - 0
Projects/永冠OPP/WCS.Service/WebApi/WMS/Request/I_WCS_MergeinfoRequest.cs

@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.Service.Entity
+{
+    public class I_WCS_MergeinfoRequest
+    {
+        /// <summary>
+        /// 容器编号
+        /// </summary>
+        [Required(ErrorMessage = "{0} 不可为空")]
+        public string ContainerBarCode { get; set; }
+        /// <summary>
+        /// 容器类型
+        /// </summary>
+        [Required(ErrorMessage = "{0} 不可为空")]
+        public int ContainerType { get; set; }
+        /// <summary>
+        /// 物料条码
+        /// </summary>
+        public string MatBarCode { get; set; }
+        /// <summary>
+        /// 仓库编码
+        /// </summary>
+        [Required(ErrorMessage = "{0} 不可为空")]
+        public string WareHouseId { get; set; }
+        /// <summary>
+        /// 设备编号
+        /// </summary>
+        [Required(ErrorMessage = "{0} 不可为空")]
+        public string EquipmentNo { get; set; }
+        /// <summary>
+        /// 目标位置
+        /// </summary>
+        public string EndPostion { get; set; }
+        /// <summary>
+        /// 货叉(直接申请货位使用)
+        /// </summary>
+        public int ForkNum { get; set; }
+        public string Memo1 { get; set; }
+        public string Memo2 { get; set; }
+        public string Memo3 { get; set; }
+        public string Memo4 { get; set; }
+
+        //[SwaggerIgnore]
+        //public string WcsBusinessType { get; set; }
+        //[SwaggerIgnore]
+        //public string WarehouseDocumentCode { get; set; }
+        //[SwaggerIgnore]
+        //public string WarehouseDocumentType { get; set; }
+        //[SwaggerIgnore]
+        //public string WarehouseDocumentDetailIds { get; set; }
+        //[SwaggerIgnore]
+        //public string ProductionLine { get; set; }
+        //[SwaggerIgnore]
+        //public long InterfaceDocId { get; set; }
+        //[SwaggerIgnore]
+        public string TaskGroupKey { get; set; }
+    }
+}

+ 55 - 0
Projects/永冠OPP/WCS.Service/WebApi/WMS/Response/I_WCS_MergeinfoResponse.cs

@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.Service.Entity
+{
+    /// <summary>
+    /// 合并响应实体
+    /// </summary>
+    public class I_WCS_MergeinfoResponse : WcsContractApiResponse
+    {
+        /// <summary>
+        /// 结果
+        /// </summary>
+        public bool ResType { get; set; }
+        /// <summary>
+        /// 操作描述
+        /// </summary>
+        public string ResMessage { get; set; } = "";
+        /// <summary>
+        /// WMS任务号
+        /// </summary>
+        public string WMSTaskNum { get; set; } = "0";
+        /// <summary>
+        /// 任务组标识
+        /// </summary>
+        public string TaskGroupKey { get; set; } = "0";
+        /// <summary>
+        /// 仓库名称
+        /// </summary>
+        public string WareHouseName { get; set; } = "";
+        /// <summary>
+        /// 卷数
+        /// </summary>
+        public int Root { get; set; }
+        /// <summary>
+        /// 备用1
+        /// </summary>
+        public string Memo1 { get; set; } = "";
+        /// <summary>
+        /// 备用2
+        /// </summary>
+        public string Memo2 { get; set; } = "";
+        /// <summary>
+        /// 备用3
+        /// </summary>
+        public string Memo3 { get; set; } = "";
+        /// <summary>
+        /// 备用4
+        /// </summary>
+        public bool Memo4 { get; set; }
+    }
+}

+ 15 - 0
Projects/永冠OPP/WCS.Service/WebApi/WMS/WMS.cs

@@ -240,6 +240,21 @@ namespace WCS.Service
             return res;
         }
 
+        public static I_WCS_MergeinfoResponse GetSingleOrDouble(string barcode, string dev)
+        {
+            var res = APICaller.CallApi<I_WCS_MergeinfoResponse>(Url + "/api/Task/I_WCS_GetSingleOrDouble", new I_WCS_MergeinfoRequest
+            {
+                MatBarCode = barcode,
+                EquipmentNo = dev
+            });
+            if (!res.ResType)
+            {
+                TaskException(dev, res.ResMessage);
+                throw new WarnException(res.ResMessage);
+            }
+            return res;
+        }
+
         public static void TaskException(string device, string exMsg)
         {
             if (exMsg == "接口调用中")

+ 2 - 2
Projects/永冠OPP/WCS.Service/Works/Station/BOPP入库.cs

@@ -146,7 +146,7 @@ namespace WCS.Service.Works.Station
                     foreach (var item in tunnels)
                     {
                         //当前巷道的取货点
-                        var allIn = Device.Where(v => v.Is(DF.SRMBOPP取货)) //一楼所有取货点
+                        var allIn = Device.Where(v => v.Is(DF.SRMBOPP取货)) 
                                           .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
                                           .Select(v => v.CODE)
                                           .ToList();
@@ -240,7 +240,7 @@ namespace WCS.Service.Works.Station
 
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
-            return dev.CODE == "G23";
+            return dev.CODE is "G23";
         }
     }
 

+ 48 - 0
Projects/永冠OPP/WCS.Service/Works/Station/合流入库.cs

@@ -0,0 +1,48 @@
+using DBHelper;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WCS.Core;
+using WCS.Entity;
+using WCS.Entity.Protocol;
+using WCS.Service.Extensions;
+using WCS.Service.Helpers;
+using WCS.Service.Log;
+
+namespace WCS.Service.Works.Station
+{
+    [WorkTitle(typeof(ProductHandler), "合流入库")]
+    internal class 合流入库 : DeviceWork<Device<IStation520, IStation521,IStation523>>
+    {
+        protected override void Do(Device<IStation520, IStation521,IStation523> dev)
+        {
+            if (Ltc.Do(dev, v => v.Data2.VoucherNo != v.Data.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
+            if (Ltc.Do(dev,v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
+            if (Ltc.Do(dev, v => v.Data2.Status.HasFlag(IstationStatus.光电状态) == false)) return;
+            if (Ltc.Do(dev, v => v.Data2.Tasknum < 10000)) return;
+                   
+            var bcr = dev.Entity.BCR();
+            var barcode = bcr.Content.Trim('\r');
+            if (barcode == "")                 
+            {
+                InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--扫码失败,内容为空", dev.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                return;
+            };
+            var res = WMS.GetSingleOrDouble(barcode,dev.Entity.CODE);
+            if (res == null) throw new WarnException($"{dev.Entity.CODE}: WMS未返回结果");
+            DB.Do(db =>
+            {
+                if (!db.Default.Set<WCS_TASK>().Any(v => v.ID == dev.Data2.Tasknum)) throw new Exception($"任务号不存在");
+                dev.Data.Tasknum = dev.Data2.Tasknum;
+                dev.Data.Goodscode = res.Root;
+                dev.Data.VoucherNo++;
+            });
+        }
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return new string[] { "3047","3163" }.Contains(dev.CODE);
+        }
+    }
+}

+ 276 - 0
Projects/永冠OPP/WCS.Service/Works/Station/连廊车间入库.cs

@@ -0,0 +1,276 @@
+using DBHelper;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WCS.Core;
+using WCS.Entity;
+using WCS.Entity.Protocol;
+using WCS.Entity.Protocol.SRM;
+using WCS.Service.Extensions;
+using WCS.Service.Helpers;
+using WCS.Service.Log;
+using TaskStatus = WCS.Entity.TaskStatus;
+
+namespace WCS.Service.Works.Station
+{
+    [WorkTitle(typeof(ProductHandler), "连廊车间扫码入库")]
+    internal class 连廊车间扫码入库 : Work<StationDeviceGroup>
+    {
+        protected override bool SelectDevice(WCS_DEVICE dev)
+        {
+            return dev.CODE is "G3052";
+        }
+
+        protected override void Do(StationDeviceGroup obj)
+        {
+            var timer = new Stopwatch();
+            timer.Start();
+            obj.EX(obj =>
+            {
+                //if (!obj.BcrStationIsForbid()) return;
+
+                //设备组无论单卷还是双卷都必须满足的条件
+                if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致");
+                if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new WarnException($"设备运行中");
+
+                //成功创建的任务
+                var finishTaskList = new List<FinishTaskList<int>>();
+                var devs = obj.GetBcrValid();
+                if (!devs.Valid(obj.Entity.CODE)) return;
+
+                var infos = devs.GetWMSInTask();
+                if (!infos.Any()) throw new WarnException($"{obj.Entity.CODE}: WMS未返回结果");
+                //创建对应的任务
+                DB.Do(db =>
+                {
+                    foreach (var item in devs)
+                    {
+                        var dev = item.Station;
+                        var next = dev.Entity.GetPath("SRM").CODE;
+                        var info = infos.FirstOrDefault(v => item.FinishCode.Contains(v.ContainerCode + "}"));
+                        if (db.Default.Set<WCS_TASK>().AsNoTracking().Any(v => v.BARCODE == info.ContainerCode && v.STATUS < TaskStatus.已完成 && v.TYPE == TaskType.入库))
+                            throw new WarnException($"生产条码{info.ContainerCode}存在未完成任务,请检查是否为标签卡重复使用");
+                        var task = new WCS_TASK();
+                        task.BARCODE = info.ContainerCode;
+                        task.TYPE = TaskType.入库;
+                        task.STATUS = TaskStatus.执行中;
+                        task.ADDRFROM = dev.Entity.CODE;
+                        task.ADDRTO = info.EndPostion;
+                        task.STARTTIME = DateTime.Now;
+                        task.UPDATEUSER = "WCS";
+                        task.UPDATETIME = DateTime.Now;
+                        task.WMSTASK = int.Parse(info.WMSTaskNum);
+                        task.TaskGroupKey = info.TaskGroupKey;
+                        task.ADDRNEXT = next;
+                        task.HEIGHT = dev.Data2.GoodsSize;
+                        task.FLOOR = 1;
+
+                        db.Default.Set<WCS_TASK>().Add(task);
+                        finishTaskList.Add(new FinishTaskList<int>(task.WMSTASK, item.Station));
+                    }
+                    //两个任务一起创建
+                    db.Default.SaveChanges();
+                });
+
+                //检查对应的任务是否已创建成功
+                DB.Do(db =>
+                {
+                    foreach (var finishTask in finishTaskList)
+                    {
+                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.WMSTASK == finishTask.FinishCode);
+                        if (task == null) continue;
+
+                        finishTask.Station.Data.Tasknum = task.ID;
+                        finishTask.Station.Data.Goodsstart = task.ADDRFROM.ToShort();
+                        finishTask.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
+                        finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
+                        finishTask.Station.Data.CmdType = IstationCmdType.扫码入库;
+                        finishTask.Station.Data.VoucherNo++;
+                    }
+                });
+                if (finishTaskList.Any())
+                {
+                    timer.Stop();
+                    InfoLog.INFO_TIMING($"{obj.Entity.CODE}--扫码入库,耗时{timer.ElapsedMilliseconds}");
+                }
+            });
+        }      
+    }
+    /// <summary>
+    /// 涂布入库AGV交互
+    /// </summary>
+    //[WorkTitle(typeof(ProductHandler), "连廊入库AGV交互")]
+    //public class 连廊入库agv交互 : Work<StationDeviceGroup>
+    //{
+    //    protected override void Do(StationDeviceGroup obj)
+    //    {
+    //        obj.EX(stationDeviceGroup =>
+    //        {
+    //            var station = stationDeviceGroup.Entity.CODE;
+
+    //            #region 处理新增AGV任务
+
+    //            DB.Do(db =>
+    //            {
+    //                //找到所有的AGV任务
+    //                var agvTasks = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库)
+    //                .Where(v => v.Status < AGVTaskStatus.完成).OrderByDescending(v => v.Status).ThenBy(v => v.CreateTime).ToArray();
+
+    //                foreach (var tasking in agvTasks)
+    //                {
+    //                    var position = tasking.Position;
+    //                    if (!ProtocolProxy.AllDatas.ContainsKey(position))
+    //                        ProtocolProxy.AllDatas[position] = new ProdLineData();
+    //                    var pld = ProtocolProxy.AllDatas[position] as ProdLineData;
+    //                    pld!.Frame = LogicHandler.Frame;
+    //                    pld.Code = position;
+    //                    pld.TaskList.Add(tasking);
+
+    //                    if (tasking.Status == AGVTaskStatus.新建)
+    //                    {
+    //                        tasking.Status = AGVTaskStatus.执行;
+    //                        tasking.UpdateTime = DateTime.Now;
+    //                        db.Default.SaveChanges();
+    //                        tasking.AGVStatusChange(AGVTaskStatus.执行, "确认执行");
+    //                    }
+    //                    //agv到达指定位置给确认后分配站台
+    //                    else if (tasking.Status == AGVTaskStatus.执行 && tasking.AGVStatus == AGVTaskStatus.确认 && string.IsNullOrEmpty(tasking.Station))
+    //                    {
+    //                        //判断提升机是否被禁用
+    //                        if (!stationDeviceGroup.BcrStationIsForbid()) continue;
+
+    //                        if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
+    //                        {
+    //                            InfoLog.INFO_INFO($"{station}手动状态");
+    //                            continue;
+    //                        }
+
+    //                        var qty = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库 && v.Status > AGVTaskStatus.新建 && v.Status < AGVTaskStatus.完成);
+    //                        if (qty.Any(v => v.Station == stationDeviceGroup.Entity.CODE) || agvTasks.Any(v => v.Station == stationDeviceGroup.Entity.CODE))
+    //                        {
+    //                            InfoLog.INFO_WARN($"已有到达{stationDeviceGroup.Entity.CODE}放货任务,暂停AGV站台分配");
+    //                            continue;
+    //                        }                          
+
+    //                        tasking.Station = stationDeviceGroup.Entity.CODE;
+    //                        tasking.Status = AGVTaskStatus.执行;
+    //                        tasking.UpdateTime = DateTime.Now;
+    //                        db.Default.SaveChanges();
+    //                        tasking.AGVStatusChange(AGVTaskStatus.执行, "分配放货点");
+    //                    }
+    //                    else if (tasking.Status < tasking.AGVStatus)
+    //                    {
+    //                        if (tasking.Station != stationDeviceGroup.Entity.CODE)
+    //                        {
+    //                            InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}不是当前站台的AGV任务");
+    //                            continue;
+    //                        }
+    //                        if (tasking.AGVStatus == AGVTaskStatus.请求_允许)
+    //                        {
+    //                            if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.自动)))
+    //                            {
+    //                                InfoLog.INFO_INFO("不在自动状态");
+    //                                continue;
+    //                            }
+    //                            if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位)))
+    //                            {
+    //                                InfoLog.INFO_INFO("设备运行中");
+    //                                continue;
+    //                            }
+    //                            if (stationDeviceGroup.Items.Any(v => !v.Data3.Status.HasFlag(StationStatus.高位)))
+    //                            {
+    //                                InfoLog.INFO_WarnDb("不在高位", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+    //                                continue;
+    //                            }
+    //                            if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
+    //                            {
+    //                                InfoLog.INFO_WarnDb("AGV请求放货,但有光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+    //                                continue;
+    //                            }
+    //                            if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
+    //                            {
+    //                                InfoLog.INFO_WarnDb("AGV放货完成信号未清除", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+    //                                continue;
+    //                            }
+    //                            if (stationDeviceGroup.Items.Any(v => v.Data2.Tasknum > 0))
+    //                            {
+    //                                InfoLog.INFO_WarnDb("已有WCS任务号", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+    //                                continue;
+    //                            }
+
+    //                            if (db.Default.Set<WCS_AGVTask>().Any(v => v.Station == tasking.Station && v.Status >= AGVTaskStatus.请求_允许 && v.Status < AGVTaskStatus.完成扫码 && v.ID != tasking.ID)) //只能允许一个
+    //                            {
+    //                                InfoLog.INFO_WarnDb("上一个允许放货的AGV任务未完成", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+    //                                continue;
+    //                            }                                                           
+    //                            tasking.Status = tasking.AGVStatus;
+    //                            tasking.UpdateTime = DateTime.Now;
+    //                            db.Default.SaveChanges();
+    //                            tasking.AGVStatusChange(tasking.AGVStatus, "允许放货");
+    //                        }
+    //                        else if (tasking.AGVStatus == AGVTaskStatus.取放完成)
+    //                        {
+    //                            if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.AGV放货完成信号)))
+    //                            {
+    //                                InfoLog.INFO_WarnDb("AGV放货完成信号未清楚", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+    //                                continue;
+    //                            }
+    //                            if (!stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态)))
+    //                            {
+    //                                InfoLog.INFO_WarnDb("放货完成无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+    //                                continue;
+    //                            }
+
+    //                            tasking.Status = tasking.AGVStatus;
+    //                            tasking.UpdateTime = DateTime.Now;
+    //                            db.Default.SaveChanges();
+    //                            foreach (var dev in stationDeviceGroup.Items)
+    //                            {
+    //                                if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
+    //                                {
+    //                                    InfoLog.INFO_WarnDb($"AGV请求放货,但设备{dev.Entity.CODE}无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+    //                                    continue;
+    //                                }
+
+    //                                dev.Data.Goodsnum = (short)tasking.Goodsnum;
+    //                                dev.Data.Istation521Status = IstationStatus.AGV放货完成信号;
+    //                            }
+    //                            tasking.AGVStatusChange(tasking.AGVStatus, "允许设备顶升下降");
+    //                        }
+    //                        else if (Ltc.Do(tasking, v => v.AGVStatus == AGVTaskStatus.完成))
+    //                        {
+    //                            tasking.Status = tasking.AGVStatus;
+    //                            tasking.UpdateTime = DateTime.Now;
+    //                            db.Default.SaveChanges();
+    //                            var devise = Device.Find(tasking.Station).Create<StationDeviceGroup>();
+    //                            foreach (var dev in devise.Items)
+    //                            {
+    //                                dev.Data.Goodscode = tasking.ID;
+    //                            }
+    //                            tasking.AGVStatusChange(tasking.AGVStatus, "完成任务");
+    //                        }
+    //                        else if (Ltc.Do(tasking, v => v.AGVStatus == AGVTaskStatus.取消))
+    //                        {
+    //                            tasking.Status = tasking.AGVStatus;
+    //                            tasking.UpdateTime = DateTime.Now;
+    //                            db.Default.SaveChanges();
+    //                            tasking.AGVStatusChange(tasking.AGVStatus, "取消任务");
+    //                        }
+    //                    }
+    //                }
+    //            });
+
+    //            #endregion 处理新增AGV任务
+    //        });
+    //    }
+
+    //    protected override bool SelectDevice(WCS_DEVICE dev)
+    //    {
+    //        return dev.CODE is "G3052";
+    //    }
+    //}
+}