From 79ad6097cbe4b4d6cee66dd8ad9c3c1c8f2b5243 Mon Sep 17 00:00:00 2001
From: IPC-610 <IPC-610@DESKTOP-6LEOOS3>
Date: 星期二, 15 十月 2024 16:42:49 +0800
Subject: [PATCH] Merge branch 'master' of http://47.95.120.53:8083/r/WCSNet6

---
 Admin.NET/WCS.Application/Hub/IPlcHub.cs                    |   13 +
 Admin.NET/WCS.Application/PLC/PLCService.cs                 |   16 +
 Admin.NET/WCS.Application/Service/WcsTask/WcsTaskService.cs |  104 +++++++++++
 Web/src/views/device/deviceInfo/index.vue                   |   10 +
 Web/src/api/wcs/wcsTask.ts                                  |    9 +
 Admin.NET/WCS.Application/Service/WcsPlc/WcsPlcService.cs   |    2 
 Admin.NET/WCS.Application/PLC/PLCTaskAction.cs              |    6 
 Admin.NET/WCS.Application/PLC/ModbusUtil.cs                 |  273 ++++++++++++++++++++++++++++++
 Admin.NET/WCS.Application/Hub/PlcHub.cs                     |   29 ++
 Web/src/views/wcs/wcsTask/index.vue                         |   34 +++
 10 files changed, 482 insertions(+), 14 deletions(-)

diff --git a/Admin.NET/WCS.Application/Hub/IPlcHub.cs b/Admin.NET/WCS.Application/Hub/IPlcHub.cs
index 580024e..1f58fde 100644
--- a/Admin.NET/WCS.Application/Hub/IPlcHub.cs
+++ b/Admin.NET/WCS.Application/Hub/IPlcHub.cs
@@ -43,9 +43,22 @@
     }
     public class PlcPositionInfo
     {
+        /// <summary>
+        /// 宸ヤ綅鍙�
+        /// </summary>
         public string StationNum { get; set; }
+        /// <summary>
+        /// 鏄惁鏈夌墿鍝�
+        /// </summary>
         public bool BoHaveItem { get; set; }
+        /// <summary>
+        /// Plc绫诲瀷
+        /// </summary>
         public PLCTypeEnum Type { get; set; }
+
+        /// <summary>
+        /// 璺烘満浣嶇疆
+        /// </summary>
         public int BoxHeight { get; set; }
         public string EndLocat { get; set; }
     }
diff --git a/Admin.NET/WCS.Application/Hub/PlcHub.cs b/Admin.NET/WCS.Application/Hub/PlcHub.cs
index bec19d3..a7caaa5 100644
--- a/Admin.NET/WCS.Application/Hub/PlcHub.cs
+++ b/Admin.NET/WCS.Application/Hub/PlcHub.cs
@@ -129,6 +129,8 @@
                            BoOffline = PLCTaskAction.boOffline,
                            BoDemo = PLCTaskAction.boDemo,
                            BoDrumReversal = PLCTaskAction.boDrumReversal,
+                           BoOutLock=PLCTaskAction.boOutLock,
+                           BoEnterLock=PLCTaskAction.boEnterLock,
                            Error = "涓嶱CL浜や簰澶辫触锛屾搷浣滃け璐ワ紒"
                        });
                     return;
@@ -146,6 +148,8 @@
                        BoOffline = PLCTaskAction.boOffline,
                        BoDemo = PLCTaskAction.boDemo,
                        BoDrumReversal = PLCTaskAction.boDrumReversal,
+                       BoOutLock = PLCTaskAction.boOutLock,
+                       BoEnterLock = PLCTaskAction.boEnterLock,
                        Error = "PCL鏈繛鎺ワ紝鎿嶄綔澶辫触锛�"
                    });
                 return;
@@ -178,6 +182,8 @@
                            BoOffline = PLCTaskAction.boOffline,
                            BoDemo = PLCTaskAction.boDemo,
                            BoDrumReversal = PLCTaskAction.boDrumReversal,
+                           BoOutLock=PLCTaskAction.boOutLock,
+                           BoEnterLock=PLCTaskAction.boEnterLock,
                            Error = "涓嶱CL浜や簰澶辫触锛屾搷浣滃け璐ワ紒"
                        });
                     return;
@@ -195,27 +201,44 @@
                        BoOffline = PLCTaskAction.boOffline,
                        BoDemo = PLCTaskAction.boDemo,
                        BoDrumReversal = PLCTaskAction.boDrumReversal,
+                       BoOutLock = PLCTaskAction.boOutLock,
+                       BoEnterLock = PLCTaskAction.boEnterLock,
                        Error = "PCL鏈繛鎺ワ紝鎿嶄綔澶辫触锛�"
                    });
                 return;
             }
         }
-        await _plcHubContext.Clients.All.UpdateService(new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal });
+        //鍑哄簱閿佸畾
+        if (context.BoOutLock.HasValue)
+        {
+            PLCTaskAction.boOutLock = context.BoOutLock.Value;
+            await _sysConfigService.UpdateConfigValue("sys_BoOutLock", context.BoOutLock.Value);
+        }
+        //鍏ュ簱閿佸畾
+        if (context.BoEnterLock.HasValue)
+        {
+            PLCTaskAction.boEnterLock = context.BoEnterLock.Value;
+            await _sysConfigService.UpdateConfigValue("sys_BoEnterLock", context.BoEnterLock.Value);
+        }
+        await _plcHubContext.Clients.All.UpdateService(new PLCServiceModel() { BoRunningState = PLCTaskAction.boRunningState, BoRefresh = PLCTaskAction.boRefresh, BoOffline = PLCTaskAction.boOffline, BoDemo = PLCTaskAction.boDemo, BoDrumReversal = PLCTaskAction.boDrumReversal, BoOutLock = PLCTaskAction.boOutLock, BoEnterLock = PLCTaskAction.boEnterLock });
     }
 }
 public class PLCServiceModel
 {
     public bool? BoRunningState { get; set; }
 
-
     public bool? BoOffline { get; set; }
-
 
     public bool? BoRefresh { get; set; }
 
     public bool? BoDemo { get; set; }
 
     public bool? BoDrumReversal { get; set; }
+
+    public bool? BoOutLock { get; set; }
+
+    public bool? BoEnterLock { get; set; }
+
     /// <summary>
     /// 閿欒淇℃伅
     /// </summary>
diff --git a/Admin.NET/WCS.Application/PLC/ModbusUtil.cs b/Admin.NET/WCS.Application/PLC/ModbusUtil.cs
new file mode 100644
index 0000000..1c77885
--- /dev/null
+++ b/Admin.NET/WCS.Application/PLC/ModbusUtil.cs
@@ -0,0 +1,273 @@
+锘縰sing IoTClient;
+using IoTClient.Clients.Modbus;
+using IoTClient.Common.Enums;
+using IoTClient.Enums;
+using IoTClient.Models;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.Application;
+/// <summary>
+/// Modbus
+/// </summary>
+public class ModbusUtil
+{
+    public readonly long PlcId;
+    public readonly string PlcIP;
+    private ModbusTcpClient _client;
+    private WcsPlc _modPlc;
+    private readonly object OLock = new object();
+    public ModbusUtil(WcsPlc modPlc)
+    {
+        //娴嬭瘯浠g爜
+        //WCS.Application.ModbusUtil modUtil = new WCS.Application.ModbusUtil(new WCS.Application.WcsPlc() { IP = "127.0.0.1", Port = 502 });
+        //var result = modUtil.GetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4");
+        //Console.WriteLine(result.value);
+        //var result2 = modUtil.SetDBValue(WCS.Application.PLCDataTypeEnum.Int, "4", "44");
+        //Console.WriteLine(result2.IsSucceed);
+
+        PlcId = modPlc.Id;
+        PlcIP = modPlc.IP;
+        _modPlc = modPlc;
+        _client = new ModbusTcpClient(modPlc.IP, modPlc.Port);
+        _client.Open();
+    }
+
+    public bool Connected
+    {
+        get { return _client.Connected; }
+    }
+    public IoTClient.Result Open()
+    {
+        return _client.Open();
+    }
+    public IoTClient.Result Close()
+    {
+        return _client.Close();
+    }
+    /// <summary>
+    /// 璇诲彇PLC鍊�
+    /// </summary>
+    /// <param name="PosType">瀛楃绫诲瀷</param>
+    /// <param name="Pos">鍋忕Щ閲�/鍦板潃</param>
+    /// <param name="StationNumber">绔欏彿</param>
+    /// <returns></returns>
+    public (IoTClient.Result, dynamic value) GetDBValue(PLCDataTypeEnum PosType, string Pos, byte StationNumber = 1)
+    {
+        lock (OLock)
+        {
+            dynamic result = null;
+            switch (PosType)
+            {
+                case PLCDataTypeEnum.Bit:
+                    result = _client.ReadCoil(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Byte:
+                    result = _client.ReadDiscrete(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Short:
+                    result = _client.ReadInt16(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.UShort:
+                    result = _client.ReadUInt16(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Int:
+                    result = _client.ReadInt32(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.UInt:
+                    result = _client.ReadUInt32(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Long:
+                    result = _client.ReadInt64(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.ULong:
+                    result = _client.ReadUInt64(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Float:
+                    result = _client.ReadFloat(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.Double:
+                    result = _client.ReadDouble(Pos, StationNumber);
+                    break;
+                case PLCDataTypeEnum.String:
+                    result = _client.ReadString(Pos, StationNumber);
+                    break;
+                default:
+                    result = new IoTClient.Result<object>();
+                    break;
+            }
+            return (result, result.Value);
+        }
+    }
+    /// <summary>
+    /// 鎵归噺璇诲彇PLC鍊�
+    /// </summary>
+    /// <returns></returns>
+    public Result<List<ModbusOutput>> GetBatchDBValue(Dictionary<string, PLCDataTypeEnum> listaddress)
+    {
+        lock (OLock)
+        {
+            var list = new List<ModbusInput>();
+            foreach (var address in listaddress)
+            {
+                switch (address.Value)
+                {
+                    case PLCDataTypeEnum.Bit:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Bool,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Byte:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Byte,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Short:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Int16,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.UShort:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.UInt16,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Int:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Int32,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.UInt:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.UInt32,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Long:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Int64,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.ULong:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.UInt64,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Float:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Float,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.Double:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.Double,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    case PLCDataTypeEnum.String:
+                        list.Add(new ModbusInput()
+                        {
+                            Address = address.Key,
+                            DataType = DataTypeEnum.String,
+                            FunctionCode = 3,
+                            StationNumber = 1
+                        });
+                        break;
+                    default:
+                        break;
+                }
+            }
+            return _client.BatchRead(list);
+        }
+    }
+    /// <summary>
+    /// 鍐欏叆PLC鍊�
+    /// </summary>
+    /// <param name="PosType">瀛楃绫诲瀷</param>
+    /// <param name="Pos">鍋忕Щ閲�/鍦板潃</param>
+    /// <param name="Value">鍐欏叆鍊�</param>
+    /// <param name="StationNumber">绔欏彿</param>
+    /// <returns></returns>
+    public IoTClient.Result SetDBValue(PLCDataTypeEnum PosType, string Pos, string Value, byte StationNumber = 1)
+    {
+        switch (PosType)
+        {
+            case PLCDataTypeEnum.Bit:
+                if (!bool.TryParse(Value, out bool bit))
+                {
+                    if (Value == "0")
+                        bit = false;
+                    else if (Value == "1")
+                        bit = true;
+                    else
+                    {
+                        throw new Exception("鍐欏叆鍊奸敊璇�");
+                    }
+                }
+                return _client.Write(Pos, bit, StationNumber);
+            case PLCDataTypeEnum.Byte:
+                return _client.Write(Pos, byte.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Short:
+                return _client.Write(Pos, short.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.UShort:
+                return _client.Write(Pos, ushort.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Int:
+                return _client.Write(Pos, int.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.UInt:
+                return _client.Write(Pos, uint.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Long:
+                return _client.Write(Pos, long.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.ULong:
+                return _client.Write(Pos, ulong.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Float:
+                return _client.Write(Pos, float.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.Double:
+                return _client.Write(Pos, float.Parse(Value), StationNumber);
+            case PLCDataTypeEnum.String:
+                return _client.Write(Pos, Value, StationNumber);
+            default:
+                return new IoTClient.Result();
+        }
+    }
+}
diff --git a/Admin.NET/WCS.Application/PLC/PLCService.cs b/Admin.NET/WCS.Application/PLC/PLCService.cs
index 058b15d..2d0be31 100644
--- a/Admin.NET/WCS.Application/PLC/PLCService.cs
+++ b/Admin.NET/WCS.Application/PLC/PLCService.cs
@@ -64,12 +64,17 @@
                 // 璺烘満绌洪棽锛岃幏鍙栧嚭搴撲换鍔°�佺Щ搴撲换鍔�
                 {
                     // 鑾峰彇浠诲姟淇℃伅
-                    var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.CreateTime).OrderBy(m => m.Levels, OrderByType.Desc)
+                    var modTask = _db.Queryable<WcsTask>().OrderBy(m => m.CreateTime).OrderBy(m => m.Levels, OrderByType.Asc)
                         .First(s => s.Status == TaskStatusEnum.Wait && (s.TaskType == TaskTypeEnum.Out || s.TaskType == TaskTypeEnum.Move)
                         && s.StartRoadway == modDevice.StationNum);
                     if (modTask == null)
                     {
                         break;
+                    }
+                    //鍒ゆ柇鍑哄簱閿佸畾鏄惁鎵撳紑
+                    if (PLCTaskAction.boOutLock)
+                    {
+                        break;//鍑哄簱閿佸畾鎵撳紑鍒欎笉鎵ц鍑哄簱浠诲姟
                     }
 
                     PlcTaskInfo taskInfo = new PlcTaskInfo();
@@ -529,6 +534,7 @@
                                     // 鏀瑰彉浠诲姟鐘舵��
                                     modTask.Status = TaskStatusEnum.Complete;
                                     modTask.FinishDate = DateTime.Now;
+                                    modTask.Levels = 999;
                                     _db.Updateable(modTask).ExecuteCommand();
                                     //涓嬪彂浠诲姟鏃ュ織
                                     HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
@@ -950,7 +956,6 @@
                 break;
             case "330":
                 {
-
                     // 鍐欏叆浠诲姟 鎵樼洏绉诲姩 340
 
                     // 鑾峰彇宸ヤ綅鎵樼洏鐮佷俊鎭�
@@ -967,6 +972,11 @@
                     {
                         // 姝ゆ墭鐩樻病鏈夊搴旂殑杞Щ浠诲姟 led鏄剧ず
                         break;
+                    }
+                    //鍒ゆ柇鍏ュ簱閿佸畾鏄惁鎵撳紑
+                    if (PLCTaskAction.boEnterLock)
+                    {
+                        break;//鍏ュ簱閿佸畾鎵撳紑鍒欎笉鎵ц鍏ュ簱浠诲姟
                     }
 
                     // 鑾峰彇宸烽亾鍙e叆搴撳伐浣�
@@ -1317,6 +1327,7 @@
                         // 鏀瑰彉浠诲姟鐘舵��
                         modTask.Status = TaskStatusEnum.Complete;
                         modTask.FinishDate = DateTime.Now;
+                        modTask.Levels = 999;
                         _db.Updateable(modTask).ExecuteCommand();
                         HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
                         // 鎻掑叆浠诲姟鏄庣粏 
@@ -1419,6 +1430,7 @@
                             // 鏀瑰彉浠诲姟鐘舵��
                             modTask.Status = TaskStatusEnum.Complete;
                             modTask.FinishDate = DateTime.Now;
+                            modTask.Levels = 999;
                             _db.Updateable(modTask).ExecuteCommand();
 
                             HubUtil.PublicTask(modTask.Adapt<WcsTaskOutput>());
diff --git a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
index f8471a5..e4ef889 100644
--- a/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
+++ b/Admin.NET/WCS.Application/PLC/PLCTaskAction.cs
@@ -17,6 +17,10 @@
     public static bool boDemo = false;
     //婊氱瓛鍙嶈浆
     public static bool boDrumReversal = false;
+    //鍑哄簱閿佸畾
+    public static bool boOutLock = false;
+    //鍏ュ簱閿佸畾
+    public static bool boEnterLock = false;
 
     public static List<PlcPositionInfo> listPositionInfo = new List<PlcPositionInfo>();
 
@@ -55,6 +59,8 @@
         boRefresh = _sysConfigService.GetConfigValue<bool>("sys_Refresh").Result;
         boDemo = _sysConfigService.GetConfigValue<bool>("sys_demo").Result;
         boDrumReversal = _sysConfigService.GetConfigValue<bool>("sys_DrumReversal").Result;
+        boOutLock = _sysConfigService.GetConfigValue<bool>("sys_BoOutLock").Result;
+        boEnterLock = _sysConfigService.GetConfigValue<bool>("sys_BoEnterLock").Result;
     }
     /// <summary>
     /// 鍒濆鍖朠LC杩炴帴
diff --git a/Admin.NET/WCS.Application/Service/WcsPlc/WcsPlcService.cs b/Admin.NET/WCS.Application/Service/WcsPlc/WcsPlcService.cs
index ed6dfd1..7aa3764 100644
--- a/Admin.NET/WCS.Application/Service/WcsPlc/WcsPlcService.cs
+++ b/Admin.NET/WCS.Application/Service/WcsPlc/WcsPlcService.cs
@@ -136,7 +136,7 @@
             }
         }
         //鏈嶅姟鐘舵��
-        var modService = new { PLCTaskAction.boRunningState, PLCTaskAction.boOffline, PLCTaskAction.boRefresh, PLCTaskAction.boDemo, PLCTaskAction.boDrumReversal };
+        var modService = new { PLCTaskAction.boRunningState, PLCTaskAction.boOffline, PLCTaskAction.boRefresh, PLCTaskAction.boDemo, PLCTaskAction.boDrumReversal, PLCTaskAction.boOutLock, PLCTaskAction.boEnterLock };
         return new { listPlc, modService };
     }
     /// <summary>
diff --git a/Admin.NET/WCS.Application/Service/WcsTask/WcsTaskService.cs b/Admin.NET/WCS.Application/Service/WcsTask/WcsTaskService.cs
index 8820828..da996a9 100644
--- a/Admin.NET/WCS.Application/Service/WcsTask/WcsTaskService.cs
+++ b/Admin.NET/WCS.Application/Service/WcsTask/WcsTaskService.cs
@@ -2,10 +2,12 @@
 using AngleSharp.Dom;
 using COSXML.Network;
 using DocumentFormat.OpenXml.Drawing.Charts;
+using DocumentFormat.OpenXml.Math;
 using Elastic.Clients.Elasticsearch.Tasks;
 using Furion.DatabaseAccessor;
 using Furion.Logging;
 using Microsoft.AspNetCore.SignalR;
+using NewLife;
 using WCS.Application.Entity;
 using WCS.Application.Service.WcsTask.Dto;
 
@@ -53,7 +55,7 @@
             .WhereIF(!string.IsNullOrWhiteSpace(input.PalletNo), u => u.PalletNo.Contains(input.PalletNo.Trim()))
             .WhereIF(!string.IsNullOrWhiteSpace(input.Origin), u => u.Origin.Contains(input.Origin.Trim()))
             .Select<WcsTaskOutput>();
-        return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
+        return await query.OrderBy(o=>o.Levels).OrderByDescending(o=>o.CreateTime).ToPagedListAsync(input.Page, input.PageSize);
     }
 
     /// <summary>
@@ -196,6 +198,7 @@
                 modTask.CancelDate = DateTime.Now;//鍙栨秷鏃堕棿
             }
             modTask.Status = input.Status;
+            modTask.Levels = 999;
             await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Status, s.IsSuccess, s.FinishDate, s.CancelDate, s.UpdateTime, s.UpdateUserId, s.UpdateUserName }).ExecuteCommandAsync();
             //鍐欏叆浠诲姟鏄庣粏琛�
             WcsTaskMonitor modTaskMonitor = new WcsTaskMonitor()
@@ -293,6 +296,105 @@
         //涓嬪彂浠诲姟鏃ュ織
         HubUtil.PublicTaskMonitor(modTaskMonitor.Adapt<WcsTaskMonitorOutput>());
     }
+    /// <summary>
+    /// 浠诲姟缃《
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "TopUpTask")]
+    [DisplayName("浠诲姟缃《")]
+    public async Task TopUpTask(UpdateWcsTaskInput input)
+    {
+        var modTask = await _wcsTaskRep.GetByIdAsync(input.Id);
+        if (modTask.Status != TaskStatusEnum.Wait)
+        {
+            throw Oops.Oh("鍙湁绛夊緟鎵ц鐨勪换鍔℃墠鑳界疆椤讹紒");
+        }
+        int editNum = 1;
+        List<string> _editTaskNoList = new List<string>();
+        //鍌ㄤ綅娣卞害
+        string locatDepth = "";
+        if (modTask.TaskType == TaskTypeEnum.Out || modTask.TaskType == TaskTypeEnum.Move)//鍑哄簱浠诲姟鎴栧叆搴撲换鍔�
+        {
+            locatDepth = modTask.StartLocate.Substring(modTask.StartLocate.Length - 1, 1);//璧峰鍌ㄤ綅娣卞害
+            if (locatDepth == "2")//鍒ゆ柇褰撳墠鍌ㄤ綅鏄惁娣卞害涓�2锛屽唴渚у偍浣�
+            {
+                string locatString = modTask.StartLocate.Substring(0, modTask.StartLocate.Length - 1) + "1";//鑾峰彇澶栦晶鍌ㄤ綅鍦板潃
+                //鍒ゆ柇澶栦晶鍌ㄤ綅鏄惁鏈夌瓑寰呮墽琛岀殑浠诲姟锛屾湁灏变紭鍏堟墽琛�
+                var modTask2 = _db.Queryable<WcsTask>().First(w => w.IsDelete == false && w.Status == TaskStatusEnum.Wait && w.StartLocate == locatString);
+                if (modTask2 != null)
+                {
+                    modTask2.Levels = 1;
+                    await _wcsTaskRep.Context.Updateable(modTask2).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
+                    _editTaskNoList.Add(modTask2.TaskNo);
+
+                    modTask.Levels = 2;
+                    await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
+                    _editTaskNoList.Add(modTask.TaskNo);
+
+                    editNum = 2;
+                }
+                else
+                {
+                    modTask.Levels = 1;
+                    await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
+                    _editTaskNoList.Add(modTask.TaskNo);
+                }
+            }
+            else
+            {
+                modTask.Levels = 1;
+                await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
+                _editTaskNoList.Add(modTask.TaskNo);
+            }
+        }
+        if (modTask.TaskType == TaskTypeEnum.In)//鍏ュ簱浠诲姟
+        {
+            if (string.IsNullOrEmpty(modTask.EndLocate))
+            {
+                throw Oops.Oh("璇ュ叆搴撲换鍔¤繕鏈垎閰嶅偍浣嶏紝缃《澶辫触锛�");
+            }
+            locatDepth = modTask.EndLocate.Substring(modTask.EndLocate.Length - 1, 1);//鐩爣鍌ㄤ綅娣卞害
+            if (locatDepth == "1")//鍒ゆ柇褰撳墠鍌ㄤ綅鏄惁娣卞害涓�1锛屽渚у偍浣�
+            {
+                string locatString = modTask.EndLocate.Substring(0, modTask.EndLocate.Length - 1) + "2";//鑾峰彇鍐呬晶鍌ㄤ綅鍦板潃
+                //鍒ゆ柇鍐呬晶鍌ㄤ綅鏄惁鏈夌瓑寰呮墽琛岀殑浠诲姟锛屾湁灏变紭鍏堟墽琛�
+                var modTask2 = _db.Queryable<WcsTask>().First(w => w.IsDelete == false && w.Status == TaskStatusEnum.Wait && (w.StartLocate == locatString || w.EndLocate == locatString));
+                if (modTask2 != null)
+                {
+                    modTask2.Levels = 1;
+                    await _wcsTaskRep.Context.Updateable(modTask2).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
+                    _editTaskNoList.Add(modTask2.TaskNo);
+
+                    modTask.Levels = 2;
+                    await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
+                    _editTaskNoList.Add(modTask.TaskNo);
+
+                    editNum = 2;
+                }
+                else
+                {
+                    modTask.Levels = 1;
+                    await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
+                    _editTaskNoList.Add(modTask.TaskNo);
+                }
+            }
+            else
+            {
+                modTask.Levels = 1;
+                await _wcsTaskRep.Context.Updateable(modTask).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
+                _editTaskNoList.Add(modTask.TaskNo);
+            }
+        }
+        //椤哄欢鍏朵粬缃《浠诲姟
+        var modTaskList = _db.Queryable<WcsTask>().Where(w => w.IsDelete == false && w.Status == TaskStatusEnum.Wait && w.Levels != 999 && !_editTaskNoList.Contains(w.TaskNo)).ToList();
+        foreach (var item in modTaskList)
+        {
+            item.Levels += editNum;
+        }
+        await _wcsTaskRep.Context.Updateable(modTaskList).UpdateColumns(s => new { s.Levels }).ExecuteCommandAsync();
+    }
 
     /// <summary>
     /// 鑷姩鐢熸垚浠诲姟鍙�
diff --git a/Web/src/api/wcs/wcsTask.ts b/Web/src/api/wcs/wcsTask.ts
index 6c44521..e8c73d2 100644
--- a/Web/src/api/wcs/wcsTask.ts
+++ b/Web/src/api/wcs/wcsTask.ts
@@ -7,6 +7,7 @@
   DetailWcsTask = '/api/wcsTask/detail',
   FinshWcsTask = '/api/wcsTask/Finsh',
   UploadWcsTask = '/api/wcsTask/UploadTask',
+  TopUpWcsTask = '/api/wcsTask/TopUpTask',
 }
 
 // 澧炲姞浠诲姟琛�
@@ -64,4 +65,12 @@
 			url: Api.UploadWcsTask,
 			method: 'post',
 			data: params,
+		});
+
+// 缃《浠诲姟
+export const topUpWcsTask = (params?: any) => 
+	request({
+			url: Api.TopUpWcsTask,
+			method: 'post',
+			data: params,
 		});
\ No newline at end of file
diff --git a/Web/src/views/device/deviceInfo/index.vue b/Web/src/views/device/deviceInfo/index.vue
index 7b827eb..6281d12 100644
--- a/Web/src/views/device/deviceInfo/index.vue
+++ b/Web/src/views/device/deviceInfo/index.vue
@@ -1,5 +1,5 @@
 <template>
-	<div class="sys-user-container" style="overflow: hidden;">
+	<div class="sys-user-container">
 		<el-row>
 			<el-col :span="3">
 				<el-collapse v-model="activeName">
@@ -24,6 +24,14 @@
 							<el-switch v-model="state.boDrumReversal" active-text="" inactive-text="婊氬姩鍙嶈浆"
 								@change="handleSwitchChange('boDrumReversal', $event)"></el-switch>
 						</el-card>
+						<el-card class="box-card" shadow="hover" style="margin-top: 3px;">
+							<el-switch v-model="state.boOutLock" active-text="" inactive-text="鍑哄簱閿佸畾"
+								@change="handleSwitchChange('boOutLock', $event)"></el-switch>
+						</el-card>
+						<el-card class="box-card" shadow="hover" style="margin-top: 3px;">
+							<el-switch v-model="state.boEnterLock" active-text="" inactive-text="鍏ュ簱閿佸畾"
+								@change="handleSwitchChange('boEnterLock', $event)"></el-switch>
+						</el-card>
 					</el-collapse-item>
 
 					<el-collapse-item title="鍫嗗灈鏈�" name="2">
diff --git a/Web/src/views/wcs/wcsTask/index.vue b/Web/src/views/wcs/wcsTask/index.vue
index f569b3a..dca6577 100644
--- a/Web/src/views/wcs/wcsTask/index.vue
+++ b/Web/src/views/wcs/wcsTask/index.vue
@@ -68,6 +68,7 @@
             @cell-click="handleClick" @sort-change="sortChange" border="">
             <el-table-column type="index" label="搴忓彿" width="55" align="center" />
             <el-table-column prop="taskNo" label="浠诲姟鍙�" width="130" show-overflow-tooltip="" />
+            <el-table-column prop="levels" label="浼樺厛绾�" width="55" show-overflow-tooltip="" />
             <el-table-column prop="taskType" width="85" label="浠诲姟绫诲瀷" show-overflow-tooltip="">
               <template #default="scope">
                 <el-tag :type="dv('TaskTypeEnum', scope.row.taskType)?.tagType"> {{ dv('TaskTypeEnum',
@@ -114,7 +115,7 @@
                 <ModifyRecord :data="scope.row" />
               </template>
             </el-table-column> -->
-            <el-table-column prop="鎿嶄綔" label="鎿嶄綔" width="150" align="center" fixed="right" show-overflow-tooltip=""
+            <el-table-column prop="鎿嶄綔" label="鎿嶄綔" width="200" align="center" fixed="right" show-overflow-tooltip=""
               v-if="auth('wcsTask:complete') || auth('wcsTask:cancell')">
               <template #default="scope">
                 <template v-if="scope.row.status <= 1">
@@ -126,6 +127,10 @@
                 <template v-if="scope.row.status == 2 && scope.row.origin == 'WMS'">
                   <el-button icon="ele-Upload" size="small" text="" type="primary" @click="uploadTask(scope.row)"
                     v-auth="'wcsTask:cancell'"> 涓婁紶 </el-button>
+                </template>
+                <template v-if="scope.row.status == 0">
+                  <el-button icon="ele-Top" size="small" text="" type="primary" @click="topUpTask(scope.row)"
+                    v-auth="'wcsTask:cancell'"> 缃《 </el-button>
                 </template>
               </template>
             </el-table-column>
@@ -148,10 +153,10 @@
             <el-row>
               <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
                 <el-form-item label="浠诲姟鍙�">
-                  <el-input v-model="queryParams2.taskNo" clearable="" placeholder="璇疯緭鍏ヤ换鍔″彿" />
+                  <el-input v-model="queryParams2.taskNo" clearable="" placeholder="璇疯緭鍏ヤ换鍔″彿"style="width: 130px;" />
                 </el-form-item>
               </el-col>
-              <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
+              <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" style="margin-left: 20px;">
                 <el-form-item>
                   <el-button type="primary" icon="ele-Search" @click="handleQuery2"> 鏌ヨ
                   </el-button>
@@ -195,7 +200,7 @@
 
 import printDialog from '/@/views/system/print/component/hiprint/preview.vue'
 import editDialog from '/@/views/wcs/wcsTask/component/editDialog.vue'
-import { pageWcsTask, finshWcsTask, uploadWcsTask } from '/@/api/wcs/wcsTask';
+import { pageWcsTask, finshWcsTask, uploadWcsTask,topUpWcsTask } from '/@/api/wcs/wcsTask';
 import { pageWcsMonitorTask } from '/@/api/wcs/wcsTaskMonitor';
 import { signalR } from './signalR';
 
@@ -333,10 +338,27 @@
   })
     .then(async () => {
       var param = Object.assign(row);
-      await uploadWcsTask(param);
+      await topUpTask(param);
       handleQuery();
       handleQuery2();
-      ElMessage.success("涓婁紶浠诲姟鎴愬姛");
+      ElMessage.success("缃《浠诲姟鎴愬姛");
+    })
+    .catch(() => { });
+
+}
+//缃《浠诲姟
+const topUpTask = async (row: any) => {
+  ElMessageBox.confirm(`纭畾瑕佺疆椤朵换鍔″悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(async () => {
+      var param = Object.assign(row);
+      await topUpWcsTask(param);
+      handleQuery();
+      handleQuery2();
+      ElMessage.success("缃《浠诲姟鎴愬姛");
     })
     .catch(() => { });
 

--
Gitblit v1.8.0