From 5999e9c77ee30a7090ed7f6cdd07d82fe9a4015b Mon Sep 17 00:00:00 2001
From: bklLiudl <673013083@qq.com>
Date: 星期三, 11 九月 2024 08:44:06 +0800
Subject: [PATCH] Merge branch 'master' into liudl

---
 Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoOutput.cs |  121 ++++
 Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs               |   26 
 Web/src/views/wcs/wcsMateialPzInfo/index.vue                                     |  217 +++++++
 Admin.NET/WCS.Application/Entity/WcsMateialPzInfo.cs                             |   83 ++
 Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs                |   61 ++
 Web/src/api/wcs/wcsDevice.ts                                                     |    8 
 Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs                                    |  206 +++++++
 Web/src/views/wcs/wcsMateialPzInfo/component/editDialog.vue                      |  191 ++++++
 Admin.NET/WCS.Application/Hub/IPlcDeviceHub.cs                                   |   16 
 Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceTaskOrderDto.cs         |    2 
 Web/src/views/device/deviceMonitor/signalR.ts                                    |   49 +
 Admin.NET/WCS.Application/Service/WcsMateialPzInfo/WcsMateialPzInfoService.cs    |  128 ++++
 Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs                  |   99 +++
 Web/src/views/device/deviceMonitor/index.vue                                     |   61 +
 Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoInput.cs  |  200 ++++++
 Web/src/views/device/sortPallet/index.vue                                        |   10 
 Admin.NET/WCS.Application/Service/WcsCheckTask/WcsCheckTaskService.cs            |   12 
 Web/src/views/device/deviceMonitor/component/setting.vue                         |   42 
 Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoDto.cs    |  119 ++++
 Web/src/views/device/wcsOderTask/component/editDialog.vue                        |    4 
 Web/src/api/wcs/wcsMateialPzInfo.ts                                              |   50 +
 21 files changed, 1,669 insertions(+), 36 deletions(-)

diff --git a/Admin.NET/WCS.Application/Entity/WcsMateialPzInfo.cs b/Admin.NET/WCS.Application/Entity/WcsMateialPzInfo.cs
new file mode 100644
index 0000000..b8f4aee
--- /dev/null
+++ b/Admin.NET/WCS.Application/Entity/WcsMateialPzInfo.cs
@@ -0,0 +1,83 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+namespace WCS.Application.Entity;
+
+/// <summary>
+/// 鐗╂枡鍝佺淇℃伅缁存姢琛�
+/// </summary>
+[SugarTable("WCSMateialPZInfo","鐗╂枡鍝佺淇℃伅缁存姢琛�")]
+[Tenant("1300000000001")]
+public class WcsMateialPzInfo  : EntityBaseData
+{
+    /// <summary>
+    /// 鐗╂枡缂栫爜
+    /// </summary>
+    [SugarColumn(ColumnName = "SkuNo", ColumnDescription = "鐗╂枡缂栫爜", Length = 20)]
+    public string? SkuNo { get; set; }
+    
+    /// <summary>
+    /// 鐗╂枡鍚嶇О
+    /// </summary>
+    [SugarColumn(ColumnName = "SkuName", ColumnDescription = "鐗╂枡鍚嶇О", Length = 20)]
+    public string? SkuName { get; set; }
+    
+    /// <summary>
+    /// 闀�
+    /// </summary>
+    [SugarColumn(ColumnName = "Length", ColumnDescription = "闀�", Length = 20)]
+    public string? Length { get; set; }
+    
+    /// <summary>
+    /// 瀹�
+    /// </summary>
+    [SugarColumn(ColumnName = "Width", ColumnDescription = "瀹�", Length = 20)]
+    public string? Width { get; set; }
+    
+    /// <summary>
+    /// 楂�
+    /// </summary>
+    [SugarColumn(ColumnName = "Height", ColumnDescription = "楂�", Length = 20)]
+    public string? Height { get; set; }
+    
+    /// <summary>
+    /// 鍝佺鍙�
+    /// </summary>
+    [SugarColumn(ColumnName = "PZNo", ColumnDescription = "鍝佺鍙�", Length = 10)]
+    public string? PZNo { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁1
+    /// </summary>
+    [SugarColumn(ColumnName = "UDF1", ColumnDescription = "澶囩敤瀛楁1", Length = 20)]
+    public string? UDF1 { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁2
+    /// </summary>
+    [SugarColumn(ColumnName = "UDF2", ColumnDescription = "澶囩敤瀛楁2", Length = 20)]
+    public string? UDF2 { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁3
+    /// </summary>
+    [SugarColumn(ColumnName = "UDF3", ColumnDescription = "澶囩敤瀛楁3", Length = 20)]
+    public string? UDF3 { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁4
+    /// </summary>
+    [SugarColumn(ColumnName = "UDF4", ColumnDescription = "澶囩敤瀛楁4", Length = 20)]
+    public string? UDF4 { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁5
+    /// </summary>
+    [SugarColumn(ColumnName = "UDF5", ColumnDescription = "澶囩敤瀛楁5", Length = 20)]
+    public string? UDF5 { get; set; }
+    
+}
diff --git a/Admin.NET/WCS.Application/Hub/IPlcDeviceHub.cs b/Admin.NET/WCS.Application/Hub/IPlcDeviceHub.cs
new file mode 100644
index 0000000..3ec5468
--- /dev/null
+++ b/Admin.NET/WCS.Application/Hub/IPlcDeviceHub.cs
@@ -0,0 +1,16 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.Application;
+public interface IPlcDeviceHub
+{
+    /// <summary>
+    /// 涓嬪彂璁惧淇℃伅
+    /// </summary>
+    /// <param name="context"></param>
+    /// <returns></returns>
+    Task PublicPlcDevice(WcsDeviceOutput context);
+}
diff --git a/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs b/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs
new file mode 100644
index 0000000..7a8ff9c
--- /dev/null
+++ b/Admin.NET/WCS.Application/Hub/PlcDeviceHub.cs
@@ -0,0 +1,206 @@
+锘縰sing Admin.NET.Core.Service;
+using DocumentFormat.OpenXml.Office2010.ExcelAc;
+using Furion.InstantMessaging;
+using Microsoft.AspNetCore.SignalR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WCS.Application;
+
+/// <summary>
+/// 浠诲姟鏃ュ織闆嗙嚎鍣�
+/// </summary>
+[MapHub("/hubs/PlcDevice")]
+public class PlcDeviceHub : Hub<IPlcDeviceHub>
+{
+    private static readonly IHubContext<PlcDeviceHub, IPlcDeviceHub> _plcDeviceHubContext = App.GetService<IHubContext<PlcDeviceHub, IPlcDeviceHub>>();
+    private static readonly SysCacheService _sysCacheService = App.GetRequiredService<SysCacheService>();
+    private static bool boRunningState = false;
+    private static CancellationTokenSource cts;//鍙栨秷绾跨▼鏍囪瘑
+    private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId);
+    public PlcDeviceHub()
+    {
+    }
+
+    /// <summary>
+    /// 杩炴帴
+    /// </summary>
+    /// <returns></returns>
+    public override async Task OnConnectedAsync()
+    {
+        var httpContext = Context.GetHttpContext();
+        var userId = (httpContext.User.FindFirst(ClaimConst.UserId)?.Value).ToLong();
+        _sysCacheService.Set("PlcDeviceHub:" + Context.ConnectionId, userId);
+        if (!boRunningState)
+        {
+            //寮�鍚鍙栨湇鍔$嚎绋�
+            boRunningState = true;
+            cts = new CancellationTokenSource();//鍙栨秷绾跨▼鏍囪瘑
+            StartRead();
+        }
+        await base.OnConnectedAsync();
+    }
+
+    /// <summary>
+    /// 鏂紑
+    /// </summary>
+    /// <param name="exception"></param>
+    /// <returns></returns>
+    public override async Task OnDisconnectedAsync(Exception exception)
+    {
+        _sysCacheService.Remove("PlcDeviceHub:" + Context.ConnectionId);
+        //濡傛灉娌℃湁杩炴帴浜� 灏卞叧闂嚎绋嬩笉璇讳簡
+        if (_sysCacheService.GetKeysByPrefixKey("PlcDeviceHub").Count == 0)
+        {
+            cts.Cancel();
+            boRunningState = false;
+        }
+        await base.OnDisconnectedAsync(exception);
+    }
+
+    /// <summary>
+    /// 寮�鍚鍙杙lc绾跨▼
+    /// </summary>
+    public static void StartRead()
+    {
+        Task.Run(() =>
+        {
+            // 鐢ㄤ簬淇濆瓨姣忎釜璁惧鐨勫垵濮嬬姸鎬�
+            var initialStates = new Dictionary<long, WcsDeviceOutput>();
+
+            var listPlc = _db.Queryable<WcsPlc>().Where(s => s.Type == PLCTypeEnum.StackingMachine || s.Type == PLCTypeEnum.ConveyorLine).ToList();
+            var listPlcId = listPlc.Select(s => s.Id).ToList();
+            var listPlcDevice = _db.Queryable<WcsDevice>().Where(s => s.DeviceType == DeviceTypeEnum.Business && listPlcId.Contains(s.PlcId)).Select<WcsDeviceOutput>().ToList();
+            var listPlcDeviceId = listPlcDevice.Select(s => s.Id).ToList();
+            var listPlcStation = _db.Queryable<WcsPosition>().Where(s => listPlcDeviceId.Contains(s.DeviceId)).ToList();
+            while (true)
+            {
+                try
+                {
+                    //鑾峰彇璺烘満鐨勭姸鎬�
+                    foreach (var modDevice in listPlcDevice)
+                    {
+                        //鍙栨秷绾跨▼
+                        if (cts.Token.IsCancellationRequested)
+                        {
+                            throw new OperationCanceledException();
+                        }
+                        var modPlc = listPlc.Where(s => s.Id == modDevice.PlcId).FirstOrDefault();
+                        modDevice.Type = modPlc.Type;
+                        //璇诲彇plc鐨勫��
+                        var modConn = PLCTaskAction.listPlcConn.FirstOrDefault(s => s != null && s.PlcId == modDevice.PlcId);
+                        if (modConn == null)
+                        {
+                            modDevice.Status = false;
+                            continue;
+                        }
+                        else
+                        {
+                            modDevice.Status = modConn.Connected;
+                        }
+                        if (modConn.Connected)
+                        {
+                            var listPosition = listPlcStation.Where(s => s.DeviceId == modDevice.Id).ToList();
+                            (var result, var plc) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos);
+                            modDevice.Plc = Convert.ToString(plc);
+                            (result, var wcs) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.WcsPos);
+                            modDevice.Wcs = Convert.ToString(wcs);
+                            //浠诲姟鍙�
+                            var modPositionTask = listPosition.FirstOrDefault(s => s.Text == "浠诲姟鍙�");
+                            (result, var taskNo) = modConn.GetPlcDBValue(modPositionTask.PosType, modDevice.DbNumber, modPositionTask.PlcPos, modPositionTask.StringLength);
+                            modDevice.TaskNo = Convert.ToString(taskNo);
+                            //浠诲姟绫诲瀷
+                            var modPositionTaskType = listPosition.FirstOrDefault(s => s.Text == "浠诲姟绫诲瀷");
+                            (result, var taskType) = modConn.GetPlcDBValue(modPositionTaskType.PosType, modDevice.DbNumber, modPositionTaskType.PlcPos);
+                            modDevice.TaskType = (TaskTypeEnum)Convert.ToInt32(taskType);
+                            //璧峰宸ヤ綅
+                            var modPositionStartLocatNo = listPosition.FirstOrDefault(s => s.Text == "璧峰宸ヤ綅");
+                            (result, var startLocatNo) = modConn.GetPlcDBValue(modPositionStartLocatNo.PosType, modDevice.DbNumber, modPositionStartLocatNo.PlcPos);
+                            modDevice.StartLocatNo = Convert.ToString(startLocatNo);
+                            //鐩殑宸ヤ綅
+                            var modPositionEndLocatNo = listPosition.FirstOrDefault(s => s.Text == "鐩殑宸ヤ綅");
+                            (result, var endLocatNo) = modConn.GetPlcDBValue(modPositionEndLocatNo.PosType, modDevice.DbNumber, modPositionEndLocatNo.PlcPos);
+                            modDevice.EndLocatNo = Convert.ToString(endLocatNo);
+                            //鎵樼洏鐮�
+                            var modPositionPalletNo = listPosition.FirstOrDefault(s => s.Text == "鎵樼洏鐮�");
+                            (result, var palletNo) = modConn.GetPlcDBValue(modPositionPalletNo.PosType, modDevice.DbNumber, modPositionPalletNo.PlcPos, modPositionPalletNo.StringLength);
+                            modDevice.PalletNo = Convert.ToString(palletNo);
+                            if (modPlc.Type == PLCTypeEnum.ConveyorLine)
+                            {
+                                //鏀捐揣鎺�
+                                var modPositionReleaseRow = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鎺�");
+                                (result, var releaseRow) = modConn.GetPlcDBValue(modPositionReleaseRow.PosType, modDevice.DbNumber, modPositionReleaseRow.PlcPos);
+                                modDevice.ReleaseRow = Convert.ToInt32(releaseRow);
+                                //鏀捐揣鍒�
+                                var modPositionReleaseCol = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鍒�");
+                                (result, var releaseCol) = modConn.GetPlcDBValue(modPositionReleaseCol.PosType, modDevice.DbNumber, modPositionReleaseCol.PlcPos);
+                                modDevice.ReleaseCol = Convert.ToInt32(releaseCol);
+                                //鏀捐揣灞�
+                                var modPositionReleaseStorey = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣灞�");
+                                (result, var releaseStorey) = modConn.GetPlcDBValue(modPositionReleaseStorey.PosType, modDevice.DbNumber, modPositionReleaseStorey.PlcPos);
+                                modDevice.ReleaseStorey = Convert.ToInt32(releaseStorey);
+                                //鍙栬揣鎺�
+                                var modPositionPickRow = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鎺�");
+                                (result, var pickRow) = modConn.GetPlcDBValue(modPositionPickRow.PosType, modDevice.DbNumber, modPositionPickRow.PlcPos);
+                                modDevice.PickRow = Convert.ToInt32(pickRow);
+                                //鍙栬揣鍒�
+                                var modPositionPickCol = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鍒�");
+                                (result, var pickCol) = modConn.GetPlcDBValue(modPositionPickCol.PosType, modDevice.DbNumber, modPositionPickCol.PlcPos);
+                                modDevice.PickCol = Convert.ToInt32(pickCol);
+                                //鍙栬揣灞�
+                                var modPositionPickStorey = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣灞�");
+                                (result, var pickStorey) = modConn.GetPlcDBValue(modPositionPickStorey.PosType, modDevice.DbNumber, modPositionPickStorey.PlcPos);
+                                modDevice.PickStorey = Convert.ToInt32(pickStorey);
+                            }
+                        }
+                        //else
+                        //{
+                        //    //娴嬭瘯
+                        //    modDevice.TaskNo = "TK00001";
+                        //    modDevice.TaskType = TaskTypeEnum.In;
+                        //    modDevice.Wcs = new Random().Next(1000).ToString();
+                        //    modDevice.Plc = new Random().Next(1000).ToString();
+                        //    modDevice.Status = true;
+                        //}
+                        // 姣旇緝涔嬪墠鐨勭姸鎬�
+                        if (initialStates.TryGetValue(modDevice.Id, out var initialState))
+                        {
+                            if (modDevice.Status != initialState.Status ||
+                                modDevice.Plc != initialState.Plc ||
+                                modDevice.Wcs != initialState.Wcs ||
+                                modDevice.TaskNo != initialState.TaskNo ||
+                                modDevice.TaskType != initialState.TaskType ||
+                                modDevice.StartLocatNo != initialState.StartLocatNo ||
+                                modDevice.EndLocatNo != initialState.EndLocatNo ||
+                                modDevice.PalletNo != initialState.PalletNo ||
+                                (modPlc.Type == PLCTypeEnum.ConveyorLine &&
+                                    (modDevice.ReleaseRow != initialState.ReleaseRow ||
+                                     modDevice.ReleaseCol != initialState.ReleaseCol ||
+                                     modDevice.ReleaseStorey != initialState.ReleaseStorey ||
+                                     modDevice.PickRow != initialState.PickRow ||
+                                     modDevice.PickCol != initialState.PickCol ||
+                                     modDevice.PickStorey != initialState.PickStorey)))
+                            {
+                                // 閫氱煡鐢ㄦ埛鍙樻洿
+                                _plcDeviceHubContext.Clients.All.PublicPlcDevice(modDevice);
+                            }
+                        }
+                        initialStates[modDevice.Id] = modDevice.Adapt<WcsDeviceOutput>();
+                    }
+                    Thread.Sleep(2000);
+                }
+                catch (OperationCanceledException)
+                {
+                    break;
+                }
+                catch (Exception)
+                {
+
+                }
+            }
+        }, cts.Token);
+    }
+}
diff --git a/Admin.NET/WCS.Application/Service/WcsCheckTask/WcsCheckTaskService.cs b/Admin.NET/WCS.Application/Service/WcsCheckTask/WcsCheckTaskService.cs
index 7963543..5d9c864 100644
--- a/Admin.NET/WCS.Application/Service/WcsCheckTask/WcsCheckTaskService.cs
+++ b/Admin.NET/WCS.Application/Service/WcsCheckTask/WcsCheckTaskService.cs
@@ -20,11 +20,14 @@
     private readonly SqlSugarRepository<WcsCheckTask> _wcsCheckTaskRep;
     private readonly SqlSugarRepository<WcsDevice> _wcsDeviceRep;
     private readonly SqlSugarRepository<WcsOderTask> _wcsOderTaskRep;
-    public WcsCheckTaskService(SqlSugarRepository<WcsCheckTask> wcsCheckTaskRep, SqlSugarRepository<WcsDevice> wcsDeviceRep, SqlSugarRepository<WcsOderTask> wcsOderTaskRep)
+    private readonly SqlSugarRepository<WcsMateialPzInfo> _wcsMateialPzInfoRep;
+
+    public WcsCheckTaskService(SqlSugarRepository<WcsCheckTask> wcsCheckTaskRep, SqlSugarRepository<WcsDevice> wcsDeviceRep, SqlSugarRepository<WcsOderTask> wcsOderTaskRep, SqlSugarRepository<WcsMateialPzInfo> wcsMateialPzInfoRep)
     {
         _wcsCheckTaskRep = wcsCheckTaskRep;
         _wcsDeviceRep = wcsDeviceRep;
         _wcsOderTaskRep = wcsOderTaskRep;
+        _wcsMateialPzInfoRep = wcsMateialPzInfoRep;
     }
 
     /// <summary>
@@ -167,6 +170,12 @@
         {
             throw Oops.Oh("浠诲姟鐘舵�佸紓甯�");
         }
+        //鐗╂枡鍝佺淇℃伅
+        var skuInfo = await _wcsMateialPzInfoRep.Context.Queryable<WcsMateialPzInfo>().Where(w => w.SkuNo == taskInfo.SkuNo).FirstAsync();
+        if (skuInfo == null)
+        {
+            throw Oops.Oh("鐗╂枡鍝佺淇℃伅涓嶅瓨鍦�");
+        }
         //鍒嗘嫞浠诲姟淇℃伅
         var checkTaskInfo = await _wcsCheckTaskRep.Context.Queryable<WcsCheckTask>().Where(w => w.Port == deviceInfo.StationNum).FirstAsync();
         if (checkTaskInfo == null)
@@ -184,6 +193,7 @@
         checkTaskInfo.BoxType = taskInfo.BoxType;
         checkTaskInfo.Qty = taskInfo.Qty;
         checkTaskInfo.Status = "1";//宸茬粦瀹�
+        checkTaskInfo.PZNo = skuInfo.PZNo;
         //鏇存柊鍒嗘嫞浠诲姟
         await _wcsCheckTaskRep.AsUpdateable(checkTaskInfo).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
     }
diff --git a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs
index c998258..a52ca44 100644
--- a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs
+++ b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceInput.cs
@@ -232,4 +232,65 @@
     /// </summary>
     [Required(ErrorMessage = "璧峰鐐逛綅涓嶈兘涓虹┖")]
     public int Pos { get; set; }
+}
+/// <summary>
+/// 鍐欏叆鍙傛暟
+/// </summary>
+public class WriteWcsDeviceInput : WcsDeviceBaseInput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+    public long Id { get; set; }
+    /// <summary>
+    /// 浠诲姟鍙�
+    /// </summary>
+    public string TaskNo { get; set; }
+    /// <summary>
+    /// 浠诲姟绫诲瀷
+    /// </summary>
+    public TaskTypeEnum? TaskType { get; set; }
+    /// <summary>
+    /// 璧峰宸ヤ綅
+    /// </summary>
+    public string StartLocatNo { get; set; }
+    /// <summary>
+    /// 缁撴潫宸ヤ綅
+    /// </summary>
+    public string EndLocatNo { get; set; }
+    /// <summary>
+    /// 鎵樼洏鐮�
+    /// </summary>
+    public string PalletNo { get; set; }
+    public string Plc { get; set; }
+    public string Wcs { get; set; }
+    /// <summary>
+    /// 杩炴帴鐘舵��
+    /// </summary>
+    public bool Status { get; set; } = false;
+    /// <summary>
+    /// 鏀捐揣鎺�
+    /// </summary>
+    public int ReleaseRow { get; set; }
+    /// <summary>
+    /// 鏀捐揣鍒�
+    /// </summary>
+    public int ReleaseCol { get; set; }
+    /// <summary>
+    /// 鏀捐揣灞�
+    /// </summary>
+    public int ReleaseStorey { get; set; }
+    /// <summary>
+    /// 鍙栬揣鎺�
+    /// </summary>
+    public int PickRow { get; set; }
+    /// <summary>
+    /// 鍙栬揣鍒�
+    /// </summary>
+    public int PickCol { get; set; }
+    /// <summary>
+    /// 鍙栬揣灞�
+    /// </summary>
+    public int PickStorey { get; set; }
 }
\ No newline at end of file
diff --git a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs
index e7d24d7..d0c4936 100644
--- a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs
+++ b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceOutput.cs
@@ -142,8 +142,30 @@
     /// 杩炴帴鐘舵��
     /// </summary>
     public bool Status { get; set; } = false;
-
-
+    /// <summary>
+    /// 鏀捐揣鎺�
+    /// </summary>
+    public int ReleaseRow { get; set; }
+    /// <summary>
+    /// 鏀捐揣鍒�
+    /// </summary>
+    public int ReleaseCol { get; set; }
+    /// <summary>
+    /// 鏀捐揣灞�
+    /// </summary>
+    public int ReleaseStorey { get; set; }
+    /// <summary>
+    /// 鍙栬揣鎺�
+    /// </summary>
+    public int PickRow { get; set; }
+    /// <summary>
+    /// 鍙栬揣鍒�
+    /// </summary>
+    public int PickCol { get; set; }
+    /// <summary>
+    /// 鍙栬揣灞�
+    /// </summary>
+    public int PickStorey { get; set; }
 }
 
 
diff --git a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceTaskOrderDto.cs b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceTaskOrderDto.cs
index 8099e82..116d386 100644
--- a/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceTaskOrderDto.cs
+++ b/Admin.NET/WCS.Application/Service/WcsDevice/Dto/WcsDeviceTaskOrderDto.cs
@@ -18,4 +18,6 @@
     /// 鎬荤鏁�/璁″垝绠辨暟/棰勪及绠辨暟
     /// </summary>
     public int? Qty { get; set; }
+    public string? LineNO { get; set; }
+    public string? PZNo { get; set; }
 }
diff --git a/Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs b/Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs
index 713e769..403432f 100644
--- a/Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs
+++ b/Admin.NET/WCS.Application/Service/WcsDevice/WcsDeviceService.cs
@@ -251,6 +251,34 @@
                         var modPositionPalletNo = listPosition.FirstOrDefault(s => s.Text == "鎵樼洏鐮�");
                         (result, var palletNo) = modConn.GetPlcDBValue(modPositionPalletNo.PosType, modDevice.DbNumber, modPositionPalletNo.PlcPos, modPositionPalletNo.StringLength);
                         modDevice.PalletNo = Convert.ToString(palletNo);
+                        if (cachePlc.Type == PLCTypeEnum.ConveyorLine)
+                        {
+                            //鏀捐揣鎺�
+                            var modPositionReleaseRow = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鎺�");
+                            (result, var releaseRow) = modConn.GetPlcDBValue(modPositionReleaseRow.PosType, modDevice.DbNumber, modPositionReleaseRow.PlcPos);
+                            modDevice.ReleaseRow = Convert.ToInt32(releaseRow);
+                            //鏀捐揣鍒�
+                            var modPositionReleaseCol = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鍒�");
+                            (result, var releaseCol) = modConn.GetPlcDBValue(modPositionReleaseCol.PosType, modDevice.DbNumber, modPositionReleaseCol.PlcPos);
+                            modDevice.ReleaseCol = Convert.ToInt32(releaseCol);
+                            //鏀捐揣灞�
+                            var modPositionReleaseStorey = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣灞�");
+                            (result, var releaseStorey) = modConn.GetPlcDBValue(modPositionReleaseStorey.PosType, modDevice.DbNumber, modPositionReleaseStorey.PlcPos);
+                            modDevice.ReleaseStorey = Convert.ToInt32(releaseStorey);
+                            //鍙栬揣鎺�
+                            var modPositionPickRow = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鎺�");
+                            (result, var pickRow) = modConn.GetPlcDBValue(modPositionPickRow.PosType, modDevice.DbNumber, modPositionPickRow.PlcPos);
+                            modDevice.PickRow = Convert.ToInt32(pickRow);
+                            //鍙栬揣鍒�
+                            var modPositionPickCol = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鍒�");
+                            (result, var pickCol) = modConn.GetPlcDBValue(modPositionPickCol.PosType, modDevice.DbNumber, modPositionPickCol.PlcPos);
+                            modDevice.PickCol = Convert.ToInt32(pickCol);
+                            //鍙栬揣灞�
+                            var modPositionPickStorey = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣灞�");
+                            (result, var pickStorey) = modConn.GetPlcDBValue(modPositionPickStorey.PosType, modDevice.DbNumber, modPositionPickStorey.PlcPos);
+                            modDevice.PickStorey = Convert.ToInt32(pickStorey);
+
+                        }
                     }
                     catch (Exception)
                     {
@@ -274,6 +302,69 @@
         }
 
         return list;
+    }
+
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "WriteValue")]
+    [DisplayName("鍐欏叆鍊�")]
+    public async Task WriteValue(WriteWcsDeviceInput modDevice)
+    {
+        var modPlc = await _wcsDeviceRep.Context.Queryable<WcsPlc>().FirstAsync(s => s.Id == modDevice.PlcId);
+        if (modPlc == null)
+            throw Oops.Bah("鎵句笉鍒癙LC淇℃伅");
+        PLCUtil modUtil = new PLCUtil(modPlc);
+        var listPosition = await _wcsDeviceRep.Context.Queryable<WcsPosition>().Where(s => s.DeviceId == modDevice.Id).ToListAsync();
+        //(var result, var plc) = modConn.GetPlcDBValue(modDevice.PosType, modDevice.DbNumber, modDevice.PlcPos);
+        //modDevice.Plc = Convert.ToString(plc);
+        //浠诲姟鍙�
+        var modPositionTask = listPosition.FirstOrDefault(s => s.Text == "浠诲姟鍙�");
+        if (modPositionTask != null)
+            modUtil.SetPlcDBValue(modPositionTask.PosType, modPositionTask.PlcPos, modDevice.TaskNo);
+        //浠诲姟绫诲瀷
+        var modPositionTaskType = listPosition.FirstOrDefault(s => s.Text == "浠诲姟绫诲瀷");
+        if (modPositionTaskType != null)
+            modUtil.SetPlcDBValue(modPositionTaskType.PosType, modPositionTaskType.PlcPos, modDevice.TaskType.ToString());
+        //璧峰宸ヤ綅
+        var modPositionStartLocatNo = listPosition.FirstOrDefault(s => s.Text == "璧峰宸ヤ綅");
+        if (modPositionStartLocatNo != null)
+            modUtil.SetPlcDBValue(modPositionStartLocatNo.PosType, modPositionStartLocatNo.PlcPos, modDevice.StartLocatNo.ToString());
+        //鐩殑宸ヤ綅
+        var modPositionEndLocatNo = listPosition.FirstOrDefault(s => s.Text == "鐩殑宸ヤ綅");
+        if (modPositionEndLocatNo != null)
+            modUtil.SetPlcDBValue(modPositionEndLocatNo.PosType, modPositionEndLocatNo.PlcPos, modDevice.EndLocatNo.ToString());
+        //鎵樼洏鐮�
+        var modPositionPalletNo = listPosition.FirstOrDefault(s => s.Text == "鎵樼洏鐮�");
+        if (modPositionPalletNo != null)
+            modUtil.SetPlcDBValue(modPositionPalletNo.PosType, modPositionPalletNo.PlcPos, modDevice.PalletNo.ToString());
+        if (modPlc.Type == PLCTypeEnum.ConveyorLine)
+        {
+            //鏀捐揣鎺�
+            var modPositionReleaseRow = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鎺�");
+            if (modPositionReleaseRow != null)
+                modUtil.SetPlcDBValue(modPositionReleaseRow.PosType, modPositionReleaseRow.PlcPos, modDevice.ReleaseRow.ToString());
+            //鏀捐揣鍒�
+            var modPositionReleaseCol = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣鍒�");
+            if (modPositionReleaseRow != null)
+                modUtil.SetPlcDBValue(modPositionReleaseCol.PosType, modPositionReleaseCol.PlcPos, modDevice.ReleaseCol.ToString());
+            //鏀捐揣灞�
+            var modPositionReleaseStorey = listPosition.FirstOrDefault(s => s.Text == "鏀捐揣灞�");
+            if (modPositionReleaseStorey != null)
+                modUtil.SetPlcDBValue(modPositionReleaseStorey.PosType, modPositionReleaseStorey.PlcPos, modDevice.ReleaseStorey.ToString());
+            //鍙栬揣鎺�
+            var modPositionPickRow = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鎺�");
+            if (modPositionPickRow != null)
+                modUtil.SetPlcDBValue(modPositionPickRow.PosType, modPositionPickRow.PlcPos, modDevice.PickRow.ToString());
+            //鍙栬揣鍒�
+            var modPositionPickCol = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣鍒�");
+            if (modPositionPickCol != null)
+                modUtil.SetPlcDBValue(modPositionPickCol.PosType, modPositionPickCol.PlcPos, modDevice.PickCol.ToString());
+            //鍙栬揣灞�
+            var modPositionPickStorey = listPosition.FirstOrDefault(s => s.Text == "鍙栬揣灞�");
+            if (modPositionPickStorey != null)
+                modUtil.SetPlcDBValue(modPositionPickStorey.PosType, modPositionPickStorey.PlcPos, modDevice.PickStorey.ToString());
+
+        }
+        modUtil.Close();
     }
 
     #region 鍒嗘嫞鐮佸灈
@@ -304,8 +395,8 @@
     [HttpGet]
     [ApiDescriptionSettings(Name = "WcsPackStationPlcList")]
     [DisplayName("鑾峰彇璁惧瀵瑰簲宸ヤ綅鍒楄〃")]
-    public async Task<List<WcsDeviceTaskOrderDto>> WcsPackStationPlcList([FromQuery]WcsDeviceBaseInput entry)
-    {       
+    public async Task<List<WcsDeviceTaskOrderDto>> WcsPackStationPlcList([FromQuery] WcsDeviceBaseInput entry)
+    {
         return await _wcsDeviceRep.Context.Queryable<WcsDevice>()
                 .LeftJoin<WcsCheckTask>((device, task) => device.StationNum == task.Port)
                 .Where((device, task) => device.PlcId == entry.PlcId)
@@ -318,7 +409,9 @@
                     LotNo=task.LotNo,
                     SkuNo=task.SkuNo,
                     SkuName=task.SkuName,
-                    Status=task.Status,
+                    LineNO=task.LineNO,
+                    Status =task.Status,
+                    PZNo=task.PZNo,
                     Qty=task.Qty
                 })
                 .ToListAsync();
diff --git a/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoDto.cs b/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoDto.cs
new file mode 100644
index 0000000..a626bab
--- /dev/null
+++ b/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoDto.cs
@@ -0,0 +1,119 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace WCS.Application;
+
+    /// <summary>
+    /// 鐗╂枡鍝佺淇℃伅缁存姢琛ㄨ緭鍑哄弬鏁�
+    /// </summary>
+    public class WcsMateialPzInfoDto
+    {
+        /// <summary>
+        /// 涓婚敭Id
+        /// </summary>
+        public long Id { get; set; }
+        
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string? SkuNo { get; set; }
+        
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string? SkuName { get; set; }
+        
+        /// <summary>
+        /// 闀�
+        /// </summary>
+        public string? Length { get; set; }
+        
+        /// <summary>
+        /// 瀹�
+        /// </summary>
+        public string? Width { get; set; }
+        
+        /// <summary>
+        /// 楂�
+        /// </summary>
+        public string? Height { get; set; }
+        
+        /// <summary>
+        /// 鍝佺鍙�
+        /// </summary>
+        public string? PZNo { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁1
+        /// </summary>
+        public string? UDF1 { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁2
+        /// </summary>
+        public string? UDF2 { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁3
+        /// </summary>
+        public string? UDF3 { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁4
+        /// </summary>
+        public string? UDF4 { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁5
+        /// </summary>
+        public string? UDF5 { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        public DateTime? CreateTime { get; set; }
+        
+        /// <summary>
+        /// 鏇存柊鏃堕棿
+        /// </summary>
+        public DateTime? UpdateTime { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰匢d
+        /// </summary>
+        public long? CreateUserId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呭鍚�
+        /// </summary>
+        public string? CreateUserName { get; set; }
+        
+        /// <summary>
+        /// 淇敼鑰匢d
+        /// </summary>
+        public long? UpdateUserId { get; set; }
+        
+        /// <summary>
+        /// 淇敼鑰呭鍚�
+        /// </summary>
+        public string? UpdateUserName { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呴儴闂↖d
+        /// </summary>
+        public long? CreateOrgId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呴儴闂ㄥ悕绉�
+        /// </summary>
+        public string? CreateOrgName { get; set; }
+        
+        /// <summary>
+        /// 杞垹闄�
+        /// </summary>
+        public bool IsDelete { get; set; }
+        
+    }
diff --git a/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoInput.cs b/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoInput.cs
new file mode 100644
index 0000000..df74f40
--- /dev/null
+++ b/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoInput.cs
@@ -0,0 +1,200 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core;
+using System.ComponentModel.DataAnnotations;
+
+namespace WCS.Application;
+
+    /// <summary>
+    /// 鐗╂枡鍝佺淇℃伅缁存姢琛ㄥ熀纭�杈撳叆鍙傛暟
+    /// </summary>
+    public class WcsMateialPzInfoBaseInput
+    {
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public virtual string? SkuNo { get; set; }
+        
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public virtual string? SkuName { get; set; }
+        
+        /// <summary>
+        /// 闀�
+        /// </summary>
+        public virtual string? Length { get; set; }
+        
+        /// <summary>
+        /// 瀹�
+        /// </summary>
+        public virtual string? Width { get; set; }
+        
+        /// <summary>
+        /// 楂�
+        /// </summary>
+        public virtual string? Height { get; set; }
+        
+        /// <summary>
+        /// 鍝佺鍙�
+        /// </summary>
+        public virtual string? PZNo { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁1
+        /// </summary>
+        public virtual string? UDF1 { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁2
+        /// </summary>
+        public virtual string? UDF2 { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁3
+        /// </summary>
+        public virtual string? UDF3 { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁4
+        /// </summary>
+        public virtual string? UDF4 { get; set; }
+        
+        /// <summary>
+        /// 澶囩敤瀛楁5
+        /// </summary>
+        public virtual string? UDF5 { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        public virtual DateTime? CreateTime { get; set; }
+        
+        /// <summary>
+        /// 鏇存柊鏃堕棿
+        /// </summary>
+        public virtual DateTime? UpdateTime { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰匢d
+        /// </summary>
+        public virtual long? CreateUserId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呭鍚�
+        /// </summary>
+        public virtual string? CreateUserName { get; set; }
+        
+        /// <summary>
+        /// 淇敼鑰匢d
+        /// </summary>
+        public virtual long? UpdateUserId { get; set; }
+        
+        /// <summary>
+        /// 淇敼鑰呭鍚�
+        /// </summary>
+        public virtual string? UpdateUserName { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呴儴闂↖d
+        /// </summary>
+        public virtual long? CreateOrgId { get; set; }
+        
+        /// <summary>
+        /// 鍒涘缓鑰呴儴闂ㄥ悕绉�
+        /// </summary>
+        public virtual string? CreateOrgName { get; set; }
+        
+        /// <summary>
+        /// 杞垹闄�
+        /// </summary>
+        public virtual bool IsDelete { get; set; }
+        
+    }
+
+    /// <summary>
+    /// 鐗╂枡鍝佺淇℃伅缁存姢琛ㄥ垎椤垫煡璇㈣緭鍏ュ弬鏁�
+    /// </summary>
+    public class PageWcsMateialPzInfoInput : BasePageInput
+    {
+        /// <summary>
+        /// 鍏抽敭瀛楁煡璇�
+        /// </summary>
+        public string? SearchKey { get; set; }
+
+        /// <summary>
+        /// 鐗╂枡缂栫爜
+        /// </summary>
+        public string? SkuNo { get; set; }
+        
+        /// <summary>
+        /// 鐗╂枡鍚嶇О
+        /// </summary>
+        public string? SkuName { get; set; }
+        
+        /// <summary>
+        /// 闀�
+        /// </summary>
+        public string? Length { get; set; }
+        
+        /// <summary>
+        /// 瀹�
+        /// </summary>
+        public string? Width { get; set; }
+        
+        /// <summary>
+        /// 楂�
+        /// </summary>
+        public string? Height { get; set; }
+        
+        /// <summary>
+        /// 鍝佺鍙�
+        /// </summary>
+        public string? PZNo { get; set; }
+        
+    }
+
+    /// <summary>
+    /// 鐗╂枡鍝佺淇℃伅缁存姢琛ㄥ鍔犺緭鍏ュ弬鏁�
+    /// </summary>
+    public class AddWcsMateialPzInfoInput : WcsMateialPzInfoBaseInput
+    {
+        /// <summary>
+        /// 杞垹闄�
+        /// </summary>
+        [Required(ErrorMessage = "杞垹闄や笉鑳戒负绌�")]
+        public override bool IsDelete { get; set; }
+        
+    }
+
+    /// <summary>
+    /// 鐗╂枡鍝佺淇℃伅缁存姢琛ㄥ垹闄よ緭鍏ュ弬鏁�
+    /// </summary>
+    public class DeleteWcsMateialPzInfoInput : BaseIdInput
+    {
+    }
+
+    /// <summary>
+    /// 鐗╂枡鍝佺淇℃伅缁存姢琛ㄦ洿鏂拌緭鍏ュ弬鏁�
+    /// </summary>
+    public class UpdateWcsMateialPzInfoInput : WcsMateialPzInfoBaseInput
+    {
+        /// <summary>
+        /// 涓婚敭Id
+        /// </summary>
+        [Required(ErrorMessage = "涓婚敭Id涓嶈兘涓虹┖")]
+        public long Id { get; set; }
+        
+    }
+
+    /// <summary>
+    /// 鐗╂枡鍝佺淇℃伅缁存姢琛ㄤ富閿煡璇㈣緭鍏ュ弬鏁�
+    /// </summary>
+    public class QueryByIdWcsMateialPzInfoInput : DeleteWcsMateialPzInfoInput
+    {
+
+    }
diff --git a/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoOutput.cs b/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoOutput.cs
new file mode 100644
index 0000000..d0f7ac1
--- /dev/null
+++ b/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/Dto/WcsMateialPzInfoOutput.cs
@@ -0,0 +1,121 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+namespace WCS.Application;
+
+/// <summary>
+/// 鐗╂枡鍝佺淇℃伅缁存姢琛ㄨ緭鍑哄弬鏁�
+/// </summary>
+public class WcsMateialPzInfoOutput
+{
+    /// <summary>
+    /// 涓婚敭Id
+    /// </summary>
+    public long Id { get; set; }
+    
+    /// <summary>
+    /// 鐗╂枡缂栫爜
+    /// </summary>
+    public string? SkuNo { get; set; }
+    
+    /// <summary>
+    /// 鐗╂枡鍚嶇О
+    /// </summary>
+    public string? SkuName { get; set; }
+    
+    /// <summary>
+    /// 闀�
+    /// </summary>
+    public string? Length { get; set; }
+    
+    /// <summary>
+    /// 瀹�
+    /// </summary>
+    public string? Width { get; set; }
+    
+    /// <summary>
+    /// 楂�
+    /// </summary>
+    public string? Height { get; set; }
+    
+    /// <summary>
+    /// 鍝佺鍙�
+    /// </summary>
+    public string? PZNo { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁1
+    /// </summary>
+    public string? UDF1 { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁2
+    /// </summary>
+    public string? UDF2 { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁3
+    /// </summary>
+    public string? UDF3 { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁4
+    /// </summary>
+    public string? UDF4 { get; set; }
+    
+    /// <summary>
+    /// 澶囩敤瀛楁5
+    /// </summary>
+    public string? UDF5 { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鏃堕棿
+    /// </summary>
+    public DateTime? CreateTime { get; set; }
+    
+    /// <summary>
+    /// 鏇存柊鏃堕棿
+    /// </summary>
+    public DateTime? UpdateTime { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰匢d
+    /// </summary>
+    public long? CreateUserId { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰呭鍚�
+    /// </summary>
+    public string? CreateUserName { get; set; }
+    
+    /// <summary>
+    /// 淇敼鑰匢d
+    /// </summary>
+    public long? UpdateUserId { get; set; }
+    
+    /// <summary>
+    /// 淇敼鑰呭鍚�
+    /// </summary>
+    public string? UpdateUserName { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰呴儴闂↖d
+    /// </summary>
+    public long? CreateOrgId { get; set; }
+    
+    /// <summary>
+    /// 鍒涘缓鑰呴儴闂ㄥ悕绉�
+    /// </summary>
+    public string? CreateOrgName { get; set; }
+    
+    /// <summary>
+    /// 杞垹闄�
+    /// </summary>
+    public bool IsDelete { get; set; }
+    
+    }
+ 
+
diff --git a/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/WcsMateialPzInfoService.cs b/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/WcsMateialPzInfoService.cs
new file mode 100644
index 0000000..37888f9
--- /dev/null
+++ b/Admin.NET/WCS.Application/Service/WcsMateialPzInfo/WcsMateialPzInfoService.cs
@@ -0,0 +1,128 @@
+锘�// Admin.NET 椤圭洰鐨勭増鏉冦�佸晢鏍囥�佷笓鍒╁拰鍏朵粬鐩稿叧鏉冨埄鍧囧彈鐩稿簲娉曞緥娉曡鐨勪繚鎶ゃ�備娇鐢ㄦ湰椤圭洰搴旈伒瀹堢浉鍏虫硶寰嬫硶瑙勫拰璁稿彲璇佺殑瑕佹眰銆�
+//
+// 鏈」鐩富瑕侀伒寰� MIT 璁稿彲璇佸拰 Apache 璁稿彲璇侊紙鐗堟湰 2.0锛夎繘琛屽垎鍙戝拰浣跨敤銆傝鍙瘉浣嶄簬婧愪唬鐮佹爲鏍圭洰褰曚腑鐨� LICENSE-MIT 鍜� LICENSE-APACHE 鏂囦欢銆�
+//
+// 涓嶅緱鍒╃敤鏈」鐩粠浜嬪嵄瀹冲浗瀹跺畨鍏ㄣ�佹壈涔辩ぞ浼氱З搴忋�佷镜鐘粬浜哄悎娉曟潈鐩婄瓑娉曞緥娉曡绂佹鐨勬椿鍔紒浠讳綍鍩轰簬鏈」鐩簩娆″紑鍙戣�屼骇鐢熺殑涓�鍒囨硶寰嬬籂绾峰拰璐d换锛屾垜浠笉鎵挎媴浠讳綍璐d换锛�
+
+using Admin.NET.Core.Service;
+using Microsoft.AspNetCore.Http;
+using WCS.Application.Entity;
+namespace WCS.Application;
+
+/// <summary>
+/// 鐗╂枡鍝佺淇℃伅缁存姢琛ㄦ湇鍔�
+/// </summary>
+[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
+public class WcsMateialPzInfoService : IDynamicApiController, ITransient
+{
+    private readonly SqlSugarRepository<WcsMateialPzInfo> _wcsMateialPzInfoRep;
+    public WcsMateialPzInfoService(SqlSugarRepository<WcsMateialPzInfo> wcsMateialPzInfoRep)
+    {
+        _wcsMateialPzInfoRep = wcsMateialPzInfoRep;
+    }
+
+    /// <summary>
+    /// 鍒嗛〉鏌ヨ鐗╂枡鍝佺淇℃伅缁存姢琛�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "Page")]
+    [DisplayName("鍒嗛〉鏌ヨ鐗╂枡鍝佺淇℃伅缁存姢琛�")]
+    public async Task<SqlSugarPagedList<WcsMateialPzInfoOutput>> Page(PageWcsMateialPzInfoInput input)
+    {
+		input.SearchKey = input.SearchKey?.Trim();
+        var query = _wcsMateialPzInfoRep.AsQueryable()
+            .WhereIF(!string.IsNullOrEmpty(input.SearchKey), u =>
+                u.SkuNo.Contains(input.SearchKey)
+                || u.SkuName.Contains(input.SearchKey)
+                || u.Length.Contains(input.SearchKey)
+                || u.Width.Contains(input.SearchKey)
+                || u.Height.Contains(input.SearchKey)
+                || u.PZNo.Contains(input.SearchKey)
+            )
+            .WhereIF(!string.IsNullOrWhiteSpace(input.SkuNo), u => u.SkuNo.Contains(input.SkuNo.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.SkuName), u => u.SkuName.Contains(input.SkuName.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Length), u => u.Length.Contains(input.Length.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Width), u => u.Width.Contains(input.Width.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.Height), u => u.Height.Contains(input.Height.Trim()))
+            .WhereIF(!string.IsNullOrWhiteSpace(input.PZNo), u => u.PZNo.Contains(input.PZNo.Trim()))
+            .Select<WcsMateialPzInfoOutput>();
+		return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
+    }
+
+    /// <summary>
+    /// 澧炲姞鐗╂枡鍝佺淇℃伅缁存姢琛�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "Add")]
+    [DisplayName("澧炲姞鐗╂枡鍝佺淇℃伅缁存姢琛�")]
+    public async Task<long> Add(AddWcsMateialPzInfoInput input)
+    {
+        var entity = input.Adapt<WcsMateialPzInfo>();
+        await _wcsMateialPzInfoRep.InsertAsync(entity);
+        return entity.Id;
+    }
+
+    /// <summary>
+    /// 鍒犻櫎鐗╂枡鍝佺淇℃伅缁存姢琛�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "Delete")]
+    [DisplayName("鍒犻櫎鐗╂枡鍝佺淇℃伅缁存姢琛�")]
+    public async Task Delete(DeleteWcsMateialPzInfoInput input)
+    {
+        var entity = await _wcsMateialPzInfoRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+        await _wcsMateialPzInfoRep.FakeDeleteAsync(entity);   //鍋囧垹闄�
+        //await _wcsMateialPzInfoRep.DeleteAsync(entity);   //鐪熷垹闄�
+    }
+
+    /// <summary>
+    /// 鏇存柊鐗╂枡鍝佺淇℃伅缁存姢琛�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "Update")]
+    [DisplayName("鏇存柊鐗╂枡鍝佺淇℃伅缁存姢琛�")]
+    public async Task Update(UpdateWcsMateialPzInfoInput input)
+    {
+        var entity = input.Adapt<WcsMateialPzInfo>();
+        await _wcsMateialPzInfoRep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
+    }
+
+    /// <summary>
+    /// 鑾峰彇鐗╂枡鍝佺淇℃伅缁存姢琛�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpGet]
+    [ApiDescriptionSettings(Name = "Detail")]
+    [DisplayName("鑾峰彇鐗╂枡鍝佺淇℃伅缁存姢琛�")]
+    public async Task<WcsMateialPzInfo> Detail([FromQuery] QueryByIdWcsMateialPzInfoInput input)
+    {
+        return await _wcsMateialPzInfoRep.GetFirstAsync(u => u.Id == input.Id);
+    }
+
+    /// <summary>
+    /// 鑾峰彇鐗╂枡鍝佺淇℃伅缁存姢琛ㄥ垪琛�
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpGet]
+    [ApiDescriptionSettings(Name = "List")]
+    [DisplayName("鑾峰彇鐗╂枡鍝佺淇℃伅缁存姢琛ㄥ垪琛�")]
+    public async Task<List<WcsMateialPzInfoOutput>> List([FromQuery] PageWcsMateialPzInfoInput input)
+    {
+        return await _wcsMateialPzInfoRep.AsQueryable().Select<WcsMateialPzInfoOutput>().ToListAsync();
+    }
+
+
+
+
+
+}
diff --git a/Web/src/api/wcs/wcsDevice.ts b/Web/src/api/wcs/wcsDevice.ts
index 4561735..fe7baa5 100644
--- a/Web/src/api/wcs/wcsDevice.ts
+++ b/Web/src/api/wcs/wcsDevice.ts
@@ -8,6 +8,7 @@
   GetWcsPlcPlcIdDropdown = '/api/wcsDevice/WcsPlcPlcIdDropdown',
   GeneratePos = '/api/wcsDevice/GeneratePos',
   ListWcsDevice = '/api/wcsDevice/list',
+  WriteValue = '/api/wcsdevice/writeValue',
 
   GetWcsPackPlcList='/api/wcsDevice/WcsPackPlcList',
   GetWcsPackStationPlcList='/api/wcsDevice/WcsPackStationPlcList',
@@ -101,4 +102,11 @@
 		url: Api.CloseTaskForPLC,
 		method: 'post',
 		data: params,
+});
+//鍐欏叆鍊�
+export const writeValue = (params?: any) => 
+	request({
+		url: Api.WriteValue,
+		method: 'post',
+		data: params,
 });
\ No newline at end of file
diff --git a/Web/src/api/wcs/wcsMateialPzInfo.ts b/Web/src/api/wcs/wcsMateialPzInfo.ts
new file mode 100644
index 0000000..a17257b
--- /dev/null
+++ b/Web/src/api/wcs/wcsMateialPzInfo.ts
@@ -0,0 +1,50 @@
+锘縤mport request from '/@/utils/request';
+enum Api {
+  AddWcsMateialPzInfo = '/api/wcsMateialPzInfo/add',
+  DeleteWcsMateialPzInfo = '/api/wcsMateialPzInfo/delete',
+  UpdateWcsMateialPzInfo = '/api/wcsMateialPzInfo/update',
+  PageWcsMateialPzInfo = '/api/wcsMateialPzInfo/page',
+  DetailWcsMateialPzInfo = '/api/wcsMateialPzInfo/detail',
+}
+
+// 澧炲姞鐗╂枡鍝佺淇℃伅缁存姢琛�
+export const addWcsMateialPzInfo = (params?: any) =>
+	request({
+		url: Api.AddWcsMateialPzInfo,
+		method: 'post',
+		data: params,
+	});
+
+// 鍒犻櫎鐗╂枡鍝佺淇℃伅缁存姢琛�
+export const deleteWcsMateialPzInfo = (params?: any) => 
+	request({
+			url: Api.DeleteWcsMateialPzInfo,
+			method: 'post',
+			data: params,
+		});
+
+// 缂栬緫鐗╂枡鍝佺淇℃伅缁存姢琛�
+export const updateWcsMateialPzInfo = (params?: any) => 
+	request({
+			url: Api.UpdateWcsMateialPzInfo,
+			method: 'post',
+			data: params,
+		});
+
+// 鍒嗛〉鏌ヨ鐗╂枡鍝佺淇℃伅缁存姢琛�
+export const pageWcsMateialPzInfo = (params?: any) => 
+	request({
+			url: Api.PageWcsMateialPzInfo,
+			method: 'post',
+			data: params,
+		});
+
+// 璇︽儏鐗╂枡鍝佺淇℃伅缁存姢琛�
+export const detailWcsMateialPzInfo = (id: any) => 
+	request({
+			url: Api.DetailWcsMateialPzInfo,
+			method: 'get',
+			data: { id },
+		});
+
+
diff --git a/Web/src/views/device/deviceMonitor/component/setting.vue b/Web/src/views/device/deviceMonitor/component/setting.vue
index c663b22..243a15f 100644
--- a/Web/src/views/device/deviceMonitor/component/setting.vue
+++ b/Web/src/views/device/deviceMonitor/component/setting.vue
@@ -10,7 +10,7 @@
 			<el-card class="box-card" shadow="hover">
 				<template #header>
 					<div class="card-header">
-						
+
 						<div>
 							<span>宸ヤ綅鍙凤細</span>
 							<el-select v-model="stationValue" placeholder="璇烽�夋嫨" filterable value-key="stationNum"
@@ -22,7 +22,8 @@
 							<el-button style="margin-left: 10px;">鑷姩</el-button>
 						</div>
 						<div>
-							<div :class="['lineStatus', stationValue.status ? 'device-status-0' : 'device-status-1']"></div>
+							<div :class="['lineStatus', stationValue.status ? 'device-status-0' : 'device-status-1']">
+							</div>
 						</div>
 					</div>
 				</template>
@@ -49,41 +50,41 @@
 									<el-input v-model="stationValue.wcs"></el-input>
 								</el-form-item>
 							</el-col>
-							
+
 							<el-col :span="12">
 								<el-form-item label="鍙栬揣鎺�">
-									<el-input ></el-input>
+									<el-input></el-input>
 								</el-form-item>
 							</el-col>
 							<el-col :span="12">
 								<el-form-item label="鏀捐揣鎺�">
-									<el-input ></el-input>
+									<el-input></el-input>
 								</el-form-item>
 							</el-col>
 							<el-col :span="12">
 								<el-form-item label="鍙栬揣鍒�">
-									<el-input ></el-input>
+									<el-input></el-input>
 								</el-form-item>
 							</el-col>
 							<el-col :span="12">
 								<el-form-item label="鏀捐揣鍒�">
-									<el-input ></el-input>
+									<el-input></el-input>
 								</el-form-item>
 							</el-col>
 							<el-col :span="12">
 								<el-form-item label="鍙栬揣灞�">
-									<el-input ></el-input>
+									<el-input></el-input>
 								</el-form-item>
 							</el-col>
 							<el-col :span="12">
 								<el-form-item label="鏀捐揣灞�">
-									<el-input ></el-input>
+									<el-input></el-input>
 								</el-form-item>
 							</el-col>
 						</el-row>
 					</el-form>
 					<div style="text-align: center;margin: 10px;">
-						<el-button class="button" size="large">鍐欏叆鏁版嵁</el-button>
+						<el-button class="button" size="large" @click="write(stationValue)">鍐欏叆鏁版嵁</el-button>
 					</div>
 				</div>
 				<template #footer>
@@ -107,6 +108,8 @@
 
 <script lang="ts" setup>
 import { ref, defineModel } from 'vue';
+import { writeValue } from '/@/api/wcs/wcsDevice';
+import { ElMessageBox,ElMessage } from 'element-plus';
 const listStationsData = defineModel<any>("listStationsData")
 const stationValue = defineModel<any>("stationValue")
 
@@ -122,7 +125,10 @@
 // 	emit('update:listStationsData', listStationsData.value);
 // 	emit('update:stationValue', stationValue);
 // };
-
+const write = async (row: any) => {
+	await writeValue(row);
+    ElMessage.success('鍐欏叆鎴愬姛锛�');
+}
 const isShowDialog = ref(false);
 
 const openDialog = async (row: any) => {
@@ -181,18 +187,18 @@
 }
 
 .lineStatus {
-    right: 0;
-    height: 20px;
-    width: 20px;
-    border-radius: 50%;
-    background-color: #67C23A;
+	right: 0;
+	height: 20px;
+	width: 20px;
+	border-radius: 50%;
+	background-color: #67C23A;
 }
 
 .device-status-0 {
-    background-color: #67C23A;
+	background-color: #67C23A;
 }
 
 .device-status-1 {
-    background-color: red;
+	background-color: red;
 }
 </style>
\ No newline at end of file
diff --git a/Web/src/views/device/deviceMonitor/index.vue b/Web/src/views/device/deviceMonitor/index.vue
index 03e945c..f66cf15 100644
--- a/Web/src/views/device/deviceMonitor/index.vue
+++ b/Web/src/views/device/deviceMonitor/index.vue
@@ -52,7 +52,6 @@
                 <div class="lineButtonfix">
                     <el-form label-position="left" label-width="80px">
                         <el-form-item>
-                            <el-button>鍐欏叆</el-button>
                             <el-button @click="openDialog">璁剧疆</el-button>
                         </el-form-item>
                     </el-form>
@@ -85,6 +84,9 @@
                             <el-form-item label="鐩殑宸ヤ綅">
                                 <el-input v-model="deviceInfo.endLocatNo"></el-input>
                             </el-form-item>
+                            <el-form-item label="鎵樼洏鐮�">
+                                <el-input v-model="deviceInfo.palletNo"></el-input>
+                            </el-form-item>
                             <el-form-item label="PLC">
                                 <el-input v-model="deviceInfo.plc"></el-input>
                             </el-form-item>
@@ -99,24 +101,50 @@
                     <div class="otherButtonfix">
                         <el-form label-position="left">
                             <el-form-item>
-                                <el-button>鍐欏叆</el-button>
+                                <el-button @click="write(deviceInfo)">鍐欏叆</el-button>
                             </el-form-item>
                         </el-form>
                     </div>
                 </el-card>
             </div>
         </el-main>
-        <setting ref="settingDialogRef" :title="title" v-model:listStationsData="listStationsData" v-model:stationValue="stationValue" />
+        <setting ref="settingDialogRef" :title="title" v-model:listStationsData="listStationsData"
+            v-model:stationValue="stationValue" />
     </el-container>
 </template>
 
 <script lang="ts" setup>
-import { ref, reactive } from 'vue';
-import { listWcsDevice } from '/@/api/wcs/wcsDevice';
+import { ref, onMounted  } from 'vue';
+import { listWcsDevice, writeValue } from '/@/api/wcs/wcsDevice';
 import { getDictDataItem as di, getDictDataList as dl } from '/@/utils/dict-utils';
 import { listWcsPlc } from '/@/api/wcs/wcsPlc';
-
+import { ElMessageBox, ElMessage } from 'element-plus';
 import setting from '/@/views/device/deviceMonitor/component/setting.vue'
+import { signalR,stopConnection } from './signalR';
+//杩炴帴signalR 鐩戝惉鍙樻洿
+onMounted(async () => {
+    signalR.off('PublicPlcDevice');
+    signalR.on('PublicPlcDevice', (data: any) => {
+        //todo 闇�瑕佹祴璇�
+        if (data.type == 0) {
+            var index = listStackingMachineData.value.findIndex(s => s.id == data.id);
+            if (index !== -1) {
+                listStackingMachineData.value.splice(index, 1, data);
+            }
+        }
+        else if (data.type == 1) {
+            lineOptions.value.forEach(s => {
+                var index = stations.value[s.id].findIndex(s => s.id == data.id);
+                if (index !== -1) {
+                    stations.value[s.id].splice(index, 1, data);
+                }
+            });
+            if (stationValue.value.id == data.id) {
+                stationValue.value = data;
+            }
+        }
+    });
+});
 
 const stations = ref<any>([]);
 const listStationsData = ref<any>([]);
@@ -138,12 +166,16 @@
 const openDialog = async () => {
     settingDialogRef.value.openDialog(stationValue);
 }
+const write = async (row: any) => {
+    await writeValue(row);
+    ElMessage.success('鍐欏叆鎴愬姛锛�');
+}
 // 鏌ヨ鎿嶄綔
 const handleQuery = async () => {
-    var listplc = await listWcsPlc({ type: 1 });
+    const listplc = await listWcsPlc({ type: 1 });
     lineOptions.value = listplc.data.result;
     lineValue.value = listplc.data.result[0].id;
-    var res = await listWcsDevice();
+    const res = await listWcsDevice();
     listStackingMachineData.value = res.data.result.filter(s => s.type == 0);
     const listConveyorLineData = res.data.result.filter(s => s.type == 1);
     listplc.data.result.forEach(s => {
@@ -153,6 +185,19 @@
         listStationsData.value = stations.value[lineValue.value];
         stationValue.value = listStationsData.value[0];
     }
+    else {
+        listStationsData.value = [];
+        stationValue.value = {
+            stationNum: '',
+            taskNo: '',
+            taskType: '',
+            startLocatNo: '',
+            endLocatNo: '',
+            plc: '',
+            wcs: '',
+            status: false
+        };
+    }
     title.value = listStationsData.value[0].text;
 };
 
diff --git a/Web/src/views/device/deviceMonitor/signalR.ts b/Web/src/views/device/deviceMonitor/signalR.ts
new file mode 100644
index 0000000..9876733
--- /dev/null
+++ b/Web/src/views/device/deviceMonitor/signalR.ts
@@ -0,0 +1,49 @@
+import * as SignalR from '@microsoft/signalr';
+import { getToken } from '/@/utils/axios-utils';
+
+// 鍒濆鍖朣ignalR瀵硅薄
+const connection = new SignalR.HubConnectionBuilder()
+	.configureLogging(SignalR.LogLevel.Information)
+	.withUrl(`${window.__env__.VITE_API_URL}/hubs/PlcDevice?token=${getToken()}`, { transport: SignalR.HttpTransportType.WebSockets, skipNegotiation: true })
+	.withAutomaticReconnect({
+		nextRetryDelayInMilliseconds: () => {
+			return 5000; // 姣�5绉掗噸杩炰竴娆�
+		},
+	})
+	.build();
+
+connection.keepAliveIntervalInMilliseconds = 15 * 1000; // 蹇冭烦妫�娴�15s
+connection.serverTimeoutInMilliseconds = 30 * 60 * 1000; // 瓒呮椂鏃堕棿30m
+
+// 鍚姩杩炴帴
+connection.start().then(() => {
+	debugger;
+	console.log('鍚姩杩炴帴plc');
+});
+// 鏂紑杩炴帴
+connection.onclose(async () => {
+	debugger;
+	console.log('鏂紑杩炴帴plc');
+});
+// 閲嶈繛涓�
+connection.onreconnecting(() => {
+	debugger;
+	console.log('鏈嶅姟鍣ㄥ凡鏂嚎plc');
+});
+// 閲嶈繛鎴愬姛
+connection.onreconnected(() => {
+	debugger;
+	console.log('閲嶈繛鎴愬姛plc');
+});
+// 鍏抽棴杩炴帴鐨勬柟娉�
+async function stopConnection() {
+	try {
+	  await connection.stop();
+	  console.log('杩炴帴宸插叧闂�');
+	} catch (error) {
+	  console.error('鍏抽棴杩炴帴鏃跺彂鐢熼敊璇�:', error);
+	}
+  }
+// connection.on('PublicPlcConn', () => {});
+
+export { connection as signalR,stopConnection };
diff --git a/Web/src/views/device/sortPallet/index.vue b/Web/src/views/device/sortPallet/index.vue
index 1612713..5bdd4f7 100644
--- a/Web/src/views/device/sortPallet/index.vue
+++ b/Web/src/views/device/sortPallet/index.vue
@@ -39,11 +39,14 @@
                                 <el-form-item label="鐗╂枡鍚嶇О">
                                     <el-input v-model="deviceInfo.skuName" readonly></el-input>
                                 </el-form-item>
+                                <el-form-item label="鍒嗘嫞绾跨紪鍙�">
+                                    <el-input v-model="deviceInfo.lineNO" readonly></el-input>
+                                </el-form-item>
                                 <el-form-item label="缁戝畾鐘舵��">
                                     <el-input :value="deviceInfo.status === '0' ? '鏈粦瀹�' : '宸茬粦瀹�'" readonly></el-input>
                                 </el-form-item>
                                 <el-form-item label="鎶撶鍝佺">
-                                    <el-input readonly></el-input>
+                                    <el-input v-model="deviceInfo.pzNo" readonly></el-input>
                                 </el-form-item>
                                 <el-form-item label="鎵樼洏鍙�">
                                     <el-input readonly></el-input>
@@ -59,7 +62,7 @@
                                 </el-form-item>
                             </el-form>
                         </div>
-                        <div class="otherButtonfix">
+                        <div v-if="!deviceInfo.text.includes('鎷嗗灈')" class="otherButtonfix">
                             <el-form label-position="left">
                                 <el-form-item>
                                     <el-button type="primary" @click="openBindDialog(deviceInfo.id)">缁戝畾</el-button>
@@ -274,5 +277,8 @@
         justify-content: flex-end;
         margin-top: 20px;
     }
+    .divDisplay{
+        display:none
+    }
 </style>
   
\ No newline at end of file
diff --git a/Web/src/views/device/wcsOderTask/component/editDialog.vue b/Web/src/views/device/wcsOderTask/component/editDialog.vue
index 29bd0c4..d0d0468 100644
--- a/Web/src/views/device/wcsOderTask/component/editDialog.vue
+++ b/Web/src/views/device/wcsOderTask/component/editDialog.vue
@@ -71,7 +71,7 @@
 						</el-form-item>
 						
 					</el-col>
-					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+					<!-- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="鐘舵��" prop="status">
 							<el-select clearable v-model="ruleForm.status" placeholder="璇烽�夋嫨鐘舵��">
 								<el-option v-for="(item,index) in dl('TaskStatusEnum')" :key="index" :value="Number(item.value)" :label="`${item.name} (${item.code}) [${item.value}]`"></el-option>
@@ -80,7 +80,7 @@
 							
 						</el-form-item>
 						
-					</el-col>
+					</el-col> -->
 					<!-- <el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
 						<el-form-item label="鏄惁鍥為鎴愬姛" prop="isSuccess">
 							<el-select clearable v-model="ruleForm.isSuccess" placeholder="璇烽�夋嫨鏄惁鍥為鎴愬姛">
diff --git a/Web/src/views/wcs/wcsMateialPzInfo/component/editDialog.vue b/Web/src/views/wcs/wcsMateialPzInfo/component/editDialog.vue
new file mode 100644
index 0000000..aa29832
--- /dev/null
+++ b/Web/src/views/wcs/wcsMateialPzInfo/component/editDialog.vue
@@ -0,0 +1,191 @@
+锘�<template>
+	<div class="wcsMateialPzInfo-container">
+		<el-dialog v-model="isShowDialog" :width="800" draggable="" :close-on-click-modal="false">
+			<template #header>
+				<div style="color: #fff">
+					<!--<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit /> </el-icon>-->
+					<span>{{ props.title }}</span>
+				</div>
+			</template>
+			<el-form :model="ruleForm" ref="ruleFormRef" label-width="auto" :rules="rules">
+				<el-row :gutter="35">
+					<el-form-item v-show="false">
+						<el-input v-model="ruleForm.id" />
+					</el-form-item>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="鐗╂枡缂栫爜" prop="skuNo">
+							<el-input v-model="ruleForm.skuNo" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="鐗╂枡鍚嶇О" prop="skuName">
+							<el-input v-model="ruleForm.skuName" placeholder="璇疯緭鍏ョ墿鏂欏悕绉�" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="闀�" prop="length">
+							<el-input v-model="ruleForm.length" placeholder="璇疯緭鍏ラ暱" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="瀹�" prop="width">
+							<el-input v-model="ruleForm.width" placeholder="璇疯緭鍏ュ" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="楂�" prop="height">
+							<el-input v-model="ruleForm.height" placeholder="璇疯緭鍏ラ珮" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="鍝佺鍙�" prop="pZNo">
+							<el-input v-model="ruleForm.pzNo" placeholder="璇疯緭鍏ュ搧绉嶅彿" maxlength="10" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="澶囩敤瀛楁1" prop="uDF1">
+							<el-input v-model="ruleForm.uDF1" placeholder="璇疯緭鍏ュ鐢ㄥ瓧娈�1" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="澶囩敤瀛楁2" prop="uDF2">
+							<el-input v-model="ruleForm.uDF2" placeholder="璇疯緭鍏ュ鐢ㄥ瓧娈�2" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="澶囩敤瀛楁3" prop="uDF3">
+							<el-input v-model="ruleForm.uDF3" placeholder="璇疯緭鍏ュ鐢ㄥ瓧娈�3" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="澶囩敤瀛楁4" prop="uDF4">
+							<el-input v-model="ruleForm.uDF4" placeholder="璇疯緭鍏ュ鐢ㄥ瓧娈�4" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="澶囩敤瀛楁5" prop="uDF5">
+							<el-input v-model="ruleForm.uDF5" placeholder="璇疯緭鍏ュ鐢ㄥ瓧娈�5" maxlength="20" show-word-limit clearable />
+							
+						</el-form-item>
+						
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="cancel">鍙� 娑�</el-button>
+					<el-button type="primary" @click="submit">纭� 瀹�</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+<style lang="scss" scoped>
+:deep(.el-select),
+:deep(.el-input-number) {
+	width: 100%;
+}
+</style>
+<script lang="ts" setup>
+	import { ref,onMounted } from "vue";
+	import { ElMessage } from "element-plus";
+	import type { FormRules } from "element-plus";
+  	import { formatDate } from '/@/utils/formatTime';
+	import { addWcsMateialPzInfo, updateWcsMateialPzInfo, detailWcsMateialPzInfo } from "/@/api/wcs/wcsMateialPzInfo";
+
+	//鐖剁骇浼犻�掓潵鐨勫弬鏁�
+	var props = defineProps({
+		title: {
+		type: String,
+		default: "",
+	},
+	});
+	//鐖剁骇浼犻�掓潵鐨勫嚱鏁帮紝鐢ㄤ簬鍥炶皟
+	const emit = defineEmits(["reloadTable"]);
+	const ruleFormRef = ref();
+	const isShowDialog = ref(false);
+	const ruleForm = ref<any>({});
+	//鑷娣诲姞鍏朵粬瑙勫垯
+	const rules = ref<FormRules>({
+	});
+
+	// 椤甸潰鍔犺浇鏃�
+	onMounted(() => {
+
+	});
+
+	// 鎵撳紑寮圭獥
+	const openDialog = async (row: any) => {
+		// ruleForm.value = JSON.parse(JSON.stringify(row));
+		// 鏀圭敤detail鑾峰彇鏈�鏂版暟鎹潵缂栬緫
+		let rowData = JSON.parse(JSON.stringify(row));
+		if (rowData.id)
+			ruleForm.value = (await detailWcsMateialPzInfo(rowData.id)).data.result;
+		else
+			ruleForm.value = rowData;
+		isShowDialog.value = true;
+	};
+
+	// 鍏抽棴寮圭獥
+	const closeDialog = () => {
+		emit("reloadTable");
+		isShowDialog.value = false;
+	};
+
+	// 鍙栨秷
+	const cancel = () => {
+		isShowDialog.value = false;
+	};
+
+	// 鎻愪氦
+	const submit = async () => {
+		ruleFormRef.value.validate(async (isValid: boolean, fields?: any) => {
+			if (isValid) {
+				let values = ruleForm.value;
+				if (ruleForm.value.id == undefined || ruleForm.value.id == null || ruleForm.value.id == "" || ruleForm.value.id == 0) {
+					await addWcsMateialPzInfo(values);
+				} else {
+					await updateWcsMateialPzInfo(values);
+				}
+				closeDialog();
+			} else {
+				ElMessage({
+					message: `琛ㄥ崟鏈�${Object.keys(fields).length}澶勯獙璇佸け璐ワ紝璇蜂慨鏀瑰悗鍐嶆彁浜,
+					type: "error",
+				});
+			}
+		});
+	};
+
+
+
+
+
+
+	//灏嗗睘鎬ф垨鑰呭嚱鏁版毚闇茬粰鐖剁粍浠�
+	defineExpose({ openDialog });
+</script>
+
+
+
+
diff --git a/Web/src/views/wcs/wcsMateialPzInfo/index.vue b/Web/src/views/wcs/wcsMateialPzInfo/index.vue
new file mode 100644
index 0000000..a978c2e
--- /dev/null
+++ b/Web/src/views/wcs/wcsMateialPzInfo/index.vue
@@ -0,0 +1,217 @@
+锘�<template>
+  <div class="wcsMateialPzInfo-container">
+    <el-card shadow="hover" :body-style="{ paddingBottom: '0' }"> 
+      <el-form :model="queryParams" ref="queryForm" labelWidth="90">
+        <el-row>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
+            <el-form-item label="鍏抽敭瀛�">
+              <el-input v-model="queryParams.searchKey" clearable="" placeholder="璇疯緭鍏ユā绯婃煡璇㈠叧閿瓧"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="鐗╂枡缂栫爜">
+              <el-input v-model="queryParams.skuNo" clearable="" placeholder="璇疯緭鍏ョ墿鏂欑紪鐮�"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="鐗╂枡鍚嶇О">
+              <el-input v-model="queryParams.skuName" clearable="" placeholder="璇疯緭鍏ョ墿鏂欏悕绉�"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="闀�">
+              <el-input v-model="queryParams.length" clearable="" placeholder="璇疯緭鍏ラ暱"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="瀹�">
+              <el-input v-model="queryParams.width" clearable="" placeholder="璇疯緭鍏ュ"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="楂�">
+              <el-input v-model="queryParams.height" clearable="" placeholder="璇疯緭鍏ラ珮"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10" v-if="showAdvanceQueryUI">
+            <el-form-item label="鍝佺鍙�">
+              <el-input v-model="queryParams.pZNo" clearable="" placeholder="璇疯緭鍏ュ搧绉嶅彿"/>
+              
+            </el-form-item>
+          </el-col>
+          <el-col :xs="24" :sm="12" :md="12" :lg="8" :xl="4" class="mb10">
+            <el-form-item >
+              <el-button-group style="display: flex; align-items: center;">
+                <el-button type="primary"  icon="ele-Search" @click="handleQuery" v-auth="'wcsMateialPzInfo:page'"> 鏌ヨ </el-button>
+                      <el-button icon="ele-Refresh" @click="() => queryParams = {}"> 閲嶇疆 </el-button>
+                        <el-button icon="ele-ZoomIn" @click="changeAdvanceQueryUI" v-if="!showAdvanceQueryUI" style="margin-left:5px;"> 楂樼骇鏌ヨ </el-button>
+                        <el-button icon="ele-ZoomOut" @click="changeAdvanceQueryUI" v-if="showAdvanceQueryUI" style="margin-left:5px;"> 闅愯棌 </el-button>
+                <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @click="openAddWcsMateialPzInfo" v-auth="'wcsMateialPzInfo:add'"> 鏂板 </el-button>
+                
+              </el-button-group>
+            </el-form-item>
+            
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card class="full-table" shadow="hover" style="margin-top: 5px">
+      <el-table
+				:data="tableData"
+				style="width: 100%"
+				v-loading="loading"
+				tooltip-effect="light"
+                				row-key="id"
+                @sort-change="sortChange"
+				border="">
+        <el-table-column type="index" label="搴忓彿" width="55" align="center"/>
+        <el-table-column prop="skuNo" label="鐗╂枡缂栫爜"  show-overflow-tooltip="" />
+        <el-table-column prop="skuName" label="鐗╂枡鍚嶇О"  show-overflow-tooltip="" />
+        <el-table-column prop="length" label="闀�"  show-overflow-tooltip="" />
+        <el-table-column prop="width" label="瀹�"  show-overflow-tooltip="" />
+        <el-table-column prop="height" label="楂�"  show-overflow-tooltip="" />
+        <el-table-column prop="pzNo" label="鍝佺鍙�"  show-overflow-tooltip="" />
+        <el-table-column prop="uDF1" label="澶囩敤瀛楁1"  show-overflow-tooltip="" />
+        <el-table-column prop="uDF2" label="澶囩敤瀛楁2"  show-overflow-tooltip="" />
+        <el-table-column prop="uDF3" label="澶囩敤瀛楁3"  show-overflow-tooltip="" />
+        <el-table-column prop="uDF4" label="澶囩敤瀛楁4"  show-overflow-tooltip="" />
+        <el-table-column prop="uDF5" label="澶囩敤瀛楁5"  show-overflow-tooltip="" />
+        <el-table-column label="鎿嶄綔" width="140" align="center" fixed="right" show-overflow-tooltip="" v-if="auth('wcsMateialPzInfo:update') || auth('wcsMateialPzInfo:delete')">
+          <template #default="scope">
+            <el-button icon="ele-Edit" size="small" text="" type="primary" @click="openEditWcsMateialPzInfo(scope.row)" v-auth="'wcsMateialPzInfo:update'"> 缂栬緫 </el-button>
+            <el-button icon="ele-Delete" size="small" text="" type="primary" @click="delWcsMateialPzInfo(scope.row)" v-auth="'wcsMateialPzInfo:delete'"> 鍒犻櫎 </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+				v-model:currentPage="tableParams.page"
+				v-model:page-size="tableParams.pageSize"
+				:total="tableParams.total"
+				:page-sizes="[10, 20, 50, 100, 200, 500]"
+				size="small"
+				background=""
+				@size-change="handleSizeChange"
+				@current-change="handleCurrentChange"
+				layout="total, sizes, prev, pager, next, jumper"
+	/>
+      <printDialog
+        ref="printDialogRef"
+        :title="printWcsMateialPzInfoTitle"
+        @reloadTable="handleQuery" />
+      <editDialog
+        ref="editDialogRef"
+        :title="editWcsMateialPzInfoTitle"
+        @reloadTable="handleQuery"
+      />
+    </el-card>
+  </div>
+</template>
+
+<script lang="ts" setup="" name="wcsMateialPzInfo">
+  import { ref } from "vue";
+  import { ElMessageBox, ElMessage } from "element-plus";
+  import { auth } from '/@/utils/authFunction';
+
+  import { formatDate } from '/@/utils/formatTime';
+
+
+  import printDialog from '/@/views/system/print/component/hiprint/preview.vue'
+  import editDialog from '/@/views/wcs/wcsMateialPzInfo/component/editDialog.vue'
+  import { pageWcsMateialPzInfo, deleteWcsMateialPzInfo } from '/@/api/wcs/wcsMateialPzInfo';
+
+  const showAdvanceQueryUI = ref(false);
+  const printDialogRef = ref();
+  const editDialogRef = ref();
+  const loading = ref(false);
+  const tableData = ref<any>([]);
+  const queryParams = ref<any>({});
+  const tableParams = ref({
+    page: 1,
+    pageSize: 10,
+    total: 0,
+  });
+
+  const printWcsMateialPzInfoTitle = ref("");
+  const editWcsMateialPzInfoTitle = ref("");
+
+  // 鏀瑰彉楂樼骇鏌ヨ鐨勬帶浠舵樉绀虹姸鎬�
+  const changeAdvanceQueryUI = () => {
+    showAdvanceQueryUI.value = !showAdvanceQueryUI.value;
+  }
+
+  // 鏌ヨ鎿嶄綔
+  const handleQuery = async () => {
+    loading.value = true;
+    var res = await pageWcsMateialPzInfo(Object.assign(queryParams.value, tableParams.value));
+    tableData.value = res.data.result?.items ?? [];
+    tableParams.value.total = res.data.result?.total;
+    loading.value = false;
+  };
+
+  // 鍒楁帓搴�
+  const sortChange = async (column: any) => {
+	queryParams.value.field = column.prop;
+	queryParams.value.order = column.order;
+	await handleQuery();
+  };
+
+  // 鎵撳紑鏂板椤甸潰
+  const openAddWcsMateialPzInfo = () => {
+    editWcsMateialPzInfoTitle.value = '娣诲姞鐗╂枡鍝佺淇℃伅';
+    editDialogRef.value.openDialog({});
+  };
+
+  // 鎵撳紑鎵撳嵃椤甸潰
+  const openPrintWcsMateialPzInfo = async (row: any) => {
+    printWcsMateialPzInfoTitle.value = '鎵撳嵃鐗╂枡鍝佺淇℃伅';
+  }
+  
+  // 鎵撳紑缂栬緫椤甸潰
+  const openEditWcsMateialPzInfo = (row: any) => {
+    editWcsMateialPzInfoTitle.value = '缂栬緫鐗╂枡鍝佺淇℃伅';
+    editDialogRef.value.openDialog(row);
+  };
+
+  // 鍒犻櫎
+  const delWcsMateialPzInfo = (row: any) => {
+    ElMessageBox.confirm(`纭畾瑕佸垹闄ゅ悧?`, "鎻愮ず", {
+    confirmButtonText: "纭畾",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+  .then(async () => {
+    await deleteWcsMateialPzInfo(row);
+    handleQuery();
+    ElMessage.success("鍒犻櫎鎴愬姛");
+  })
+  .catch(() => {});
+  };
+
+  // 鏀瑰彉椤甸潰瀹归噺
+  const handleSizeChange = (val: number) => {
+    tableParams.value.pageSize = val;
+    handleQuery();
+  };
+
+  // 鏀瑰彉椤电爜搴忓彿
+  const handleCurrentChange = (val: number) => {
+    tableParams.value.page = val;
+    handleQuery();
+  };
+
+  handleQuery();
+</script>
+<style scoped>
+:deep(.el-input),
+:deep(.el-select),
+:deep(.el-input-number) {
+	width: 100%;
+}
+</style>
+

--
Gitblit v1.8.0