From b0b5deb5825684bca5b3fa7c2ab59f60ce0e799f Mon Sep 17 00:00:00 2001
From: xiazhengtongxue <133085197+xiazhengtongxue@users.noreply.github.com>
Date: 星期二, 07 四月 2026 16:36:57 +0800
Subject: [PATCH] fix: 修复移库任务号重复问题,优化策略优先处理正常任务,避免任务堵塞

---
 项目代码/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs |  442 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 418 insertions(+), 24 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
index 482a45b..14d38a2 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
@@ -15,7 +15,10 @@
  *----------------------------------------------------------------*/
 #endregion << 鐗� 鏈� 娉� 閲� >>
 
+using Autofac.Core;
 using AutoMapper;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Logging;
 using Org.BouncyCastle.Math.EC;
 using SixLabors.ImageSharp;
@@ -35,6 +38,7 @@
 using WIDESEA_Core.BaseServices;
 using WIDESEA_Core.Enums;
 using WIDESEA_Core.Helper;
+using WIDESEA_Core.Utilities;
 using WIDESEA_DTO.Inbound;
 using WIDESEA_DTO.Task;
 using WIDESEA_IBasicService;
@@ -56,6 +60,7 @@
         private readonly ILocationInfoService _locationInfoService;
         private readonly IWarehouseService _warehouseService;
         private readonly IRoadWayinfoService _roadWayinfoService;
+        private readonly ITask_HtyService _task_HtyService;
         private Timer _timer;
         public IRepository<Dt_Task> Repository => BaseDal;
 
@@ -70,7 +75,7 @@
         public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
 
         public TaskService(ILogger<TaskService> logger, IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, ILocationInfoService locationInfoService,
-            IWarehouseService warehouseService, IRoadWayinfoService roadWayinfoService) : base(BaseDal)
+            IWarehouseService warehouseService, IRoadWayinfoService roadWayinfoService, ITask_HtyService task_HtyService) : base(BaseDal)
         {
             _logger = logger;
             _mapper = mapper;
@@ -78,8 +83,8 @@
             _stockInfoService = stockInfoService;
             _locationInfoService = locationInfoService;
             _warehouseService = warehouseService;
-            _roadWayinfoService=roadWayinfoService;
-
+            _roadWayinfoService = roadWayinfoService;
+            _task_HtyService = task_HtyService;
         }
         public string MES_InReporttask = WIDESEA_Core.Helper.AppSettings.Configuration["MES_InReporttask"]; //鍏ュ簱鍙嶉淇℃伅
         public string MES_OutReporttask = WIDESEA_Core.Helper.AppSettings.Configuration["MES_OutReporttask"];   //鍑哄簱鍙嶉淇℃伅
@@ -92,33 +97,124 @@
 
         public WebResponseContent CESTEXT()
         {
-            WriteLog.Write_Log("鎺ユ敹MES鍏ュ簱浠诲姟涓嬪彂", $"浠诲姟鎺ユ敹鍙傛暟", "鎴愬姛", $"鍙傛暟锛�234jkljsldafjlasdf");
+
             return WebResponseContent.Instance.OK();
         }
 
+
+        //鎵嬪姩锛屼换鍔′笂鎶�
+        #region
+        public WebResponseContent MESManualUpload(SaveModel saveModel)
+        {
+            WebResponseContent response = new WebResponseContent();
+
+            List<Dt_Task> stdata=new List<Dt_Task>();
+            try
+            {
+                foreach (var key in saveModel.DelKeys)
+                {
+                    int taskId = int.Parse(key.ToString());
+                    Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == taskId);
+                    
+                    WebResponseContent taskResult = ProcessTask(task);
+                    if (!taskResult.Status)
+                    {
+                        WriteLog.Write_Log("WMS_鎵嬪姩涓婃姤浠诲姟", $"浠诲姟涓婃姤", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode},", $"鍘熷洜锛歿taskResult.Message}");
+                        return taskResult;
+                    }
+                    stdata.Add(task);
+                }
+                WriteLog.Write_Log("WMS_鎵嬪姩涓婃姤浠诲姟", $"浠诲姟涓婃姤", $"鎴愬姛", $"涓婃姤鐨勬暟鎹細{stdata.ToJson()}");
+                return response.OK("鎵�鏈変换鍔″鐞嗘垚鍔�");
+            }
+            catch (Exception ex)
+            {
+                WriteLog.Write_Log("WMS_鎵嬪姩涓婃姤浠诲姟", $"浠诲姟涓婃姤", $"澶辫触", $"WMS浠诲姟瀹屾垚閿欒锛歿ex.Message}");
+                return response.Error($"WMS浠诲姟瀹屾垚閿欒锛歿ex.Message}");
+            }
+        }
+
+        private WebResponseContent ProcessTask(Dt_Task task)
+        {
+            WebResponseContent response = new WebResponseContent();
+
+            switch ((TaskTypeEnum)task.TaskType)
+            {
+                case TaskTypeEnum.Inbound:
+                    if (task.TaskStatus != (int)InTaskStatusEnum.InPLCException &&
+                        task.TaskStatus != (int)InTaskStatusEnum.InSCException)
+                    {
+                        return response.Error($"浠诲姟绫诲瀷閿欒锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
+                    }
+                    return HandleInboundTask(task,
+                        GetWcsType(task.TaskStatus,
+                        (int)InTaskStatusEnum.InPLCException,
+                        (int)InTaskStatusEnum.InSCException)
+                        );
+
+                case TaskTypeEnum.Outbound:
+                    if (task.TaskStatus != (int)OutTaskStatusEnum.OutPLCException &&
+                        task.TaskStatus != (int)OutTaskStatusEnum.OutSCException)
+                    {
+                        return response.Error($"浠诲姟绫诲瀷閿欒锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
+                    }
+                    return HandleOutboundTask(task, GetWcsType(task.TaskStatus,
+                        (int)OutTaskStatusEnum.OutPLCException,
+                        (int)OutTaskStatusEnum.OutSCException));
+
+                case TaskTypeEnum.Relocation:
+                    return HandleRelocationTask(task, 2);
+
+                default:
+                    return response.Error($"浠诲姟绫诲瀷閿欒锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode},绫诲瀷锛歿task.TaskType}");
+            }
+        }
+
+        private int GetWcsType(int taskStatus, int plcStatus, int scStatus)
+        {
+            if (taskStatus == plcStatus) return 1;
+            if (taskStatus == scStatus) return 2;
+            return 0;
+        }
+
+        #endregion
 
         /// <summary>
         /// 浠诲姟瀹屾垚鎺ュ彛
         /// </summary>
         /// <param name="wCSTask"></param>
         /// <returns></returns>
+
+        #region 浠诲姟瀹屾垚
         public WebResponseContent TaskCompleted(WCSTaskDTO wCSTask)
         {
-            WebResponseContent webResponse= new WebResponseContent();
+            WebResponseContent webResponse = new WebResponseContent();
             try
             {
                 Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == wCSTask.TaskNum && x.PalletCode == wCSTask.PalletCode);
                 if (task == null)
-                    return webResponse.Error("鏈壘鍒颁换鍔′俊鎭�");
+                    return webResponse.Error("鏈壘鍒颁换鍔′俊鎭�", 404);
+                return TaskCompletedtask(task, wCSTask.TaskType);
+            }
+            catch (Exception ex)
+            {
+                return webResponse.Error($"WMS浠诲姟瀹屾垚閿欒锛歿ex.Message}");
+            }
+        }
 
+        public WebResponseContent TaskCompletedtask(Dt_Task task, int wcstype)
+        {
+            WebResponseContent webResponse = new WebResponseContent();
+            try
+            {
                 switch ((TaskTypeEnum)task.TaskType)
                 {
                     case TaskTypeEnum.Inbound:
-                        return HandleInboundTask(task, wCSTask.TaskType);
+                        return HandleInboundTask(task, wcstype);
                     case TaskTypeEnum.Outbound:
-                        return HandleOutboundTask(task, wCSTask.TaskType);
+                        return HandleOutboundTask(task, wcstype);
                     case TaskTypeEnum.Relocation:
-                        return HandleRelocationTask(task, wCSTask.TaskType);
+                        return HandleRelocationTask(task, wcstype);
                     default:
                         return webResponse.Error($"浠诲姟绫诲瀷閿欒锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode},绫诲瀷锛歿task.TaskType}");
                 }
@@ -128,6 +224,8 @@
                 return webResponse.Error($"WMS浠诲姟瀹屾垚閿欒锛歿ex.Message}");
             }
         }
+
+
 
         private WebResponseContent HandleInboundTask(Dt_Task task, int wcsTaskType)
         {
@@ -140,7 +238,7 @@
 
                         if (string.IsNullOrEmpty(task.TargetAddress))
                         {
-                            if(task.TaskStatus == (int)InTaskStatusEnum.PLC_InExecuting)
+                            if (task.TaskStatus == (int)InTaskStatusEnum.PLC_InExecuting || task.TaskStatus == (int)InTaskStatusEnum.InPLCException)
                             {
                                 int loctype = 0;
                                 if (task.Roadway == "1" || task.Roadway == "2")
@@ -155,12 +253,22 @@
 
                                 //鏌ユ壘璐т綅锛屾洿鏂颁换鍔�
                                 Dt_LocationInfo dt_Location = _locationInfoService.GetLocation(task.Roadway, loctype);
+                                if (dt_Location == null)
+                                {
+                                    WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"杈撻�佺嚎瀹屾垚", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"鏈壘鍒拌璐т綅淇℃伅,鎵樼洏缂栧彿锛歿task.PalletCode}");
+                                    return content.Error($"鏈壘鍒拌璐т綅淇℃伅,鎵樼洏缂栧彿锛歿task.PalletCode}");
+                                }
                                 Dt_LocationInfo ShallowCargoHold = _locationInfoService.ShallowGetLocation(dt_Location.RoadwayNo, dt_Location.LocationType, dt_Location.Row, dt_Location.Layer, dt_Location.Column);
-                                if (ShallowCargoHold == null) return content.Error($"鏈壘鍒拌璐т綅淇℃伅,璐т綅缂栧彿:{dt_Location.LocationCode}鐨勬祬璐т綅");
+                                if (ShallowCargoHold == null)
+                                {
+                                    WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"杈撻�佺嚎瀹屾垚", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"鏈壘鍒拌璐т綅淇℃伅,璐т綅缂栧彿:{dt_Location.LocationCode}鐨勬祬璐т綅");
+                                    return content.Error($"鏈壘鍒拌璐т綅淇℃伅,璐т綅缂栧彿:{dt_Location.LocationCode}鐨勬祬璐т綅");
+                                }
                                 if (ShallowCargoHold.LocationStatus != (int)LocationStatusEnum.Free) return content.Error($"浠诲姟鍙凤細{task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode},鏌ユ壘鐨勮揣浣嶆祬璐т綅鏈夎揣锛岃揣浣嶇紪鍙凤細{ShallowCargoHold.LocationCode}");
 
                                 if (task.PalletCode[0] == 1 && (dt_Location.RoadwayNo == "1" || dt_Location.RoadwayNo == "2") && dt_Location.Column < 4)
                                 {
+                                    WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"杈撻�佺嚎瀹屾垚", $"澶辫触,鎵樼洏鏉$爜锛歿task.PalletCode},璐т綅缂栧彿:{dt_Location.LocationCode}", $"鏉$爜涓洪珮鎵樼洏锛屼絾鏄煡鎵剧殑璐т綅瑕佸叆鍦ㄤ綆鎵樼洏涓�");
                                     return content.Error($"鏉$爜涓洪珮鎵樼洏锛屼絾鏄煡鎵剧殑璐т綅瑕佸叆鍦ㄤ綆鎵樼洏涓嬶紝鏁呴殰,鎵樼洏鏉$爜锛歿task.PalletCode},璐т綅缂栧彿:{dt_Location.LocationCode}");
                                 }
 
@@ -182,25 +290,30 @@
                                 dt_StockInfo.StockStatus = (int)StockStatusEmun.鍏ュ簱涓�;
                                 dt_StockInfo.Creater = "MWS";
                                 dt_StockInfo.CreateDate = DateTime.Now;
+                                dt_StockInfo.Roadway = task.Roadway;
+
 
                                 _unitOfWorkManage.BeginTran();
                                 _stockInfoService.AddData(dt_StockInfo);
                                 _locationInfoService.UpdateData(dt_Location);
                                 BaseDal.UpdateData(task);
                                 _unitOfWorkManage.CommitTran();
+                                WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"杈撻�佺嚎瀹屾垚", $"鎴愬姛锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"宸叉帴鏀跺叆搴撹緭閫佺嚎瀹屾垚淇℃伅,娣诲姞搴撳瓨淇℃伅锛歿dt_StockInfo.ToJson()}锛屼慨鏀硅揣浣嶏細{dt_Location.ToJson()}");
+
                                 return content.OK($"宸叉帴鏀跺叆搴撹緭閫佺嚎瀹屾垚淇℃伅锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                             }
                             else
                             {
+                                WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"杈撻�佺嚎瀹屾垚", $"鎴愬姛锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婃姤澶辫触锛屽綋鍓嶄换鍔′笉鏄緭閫佺嚎鎵ц涓紝WCS涓婃姤瀹屾垚澶辫触");
                                 return content.Error("涓婃姤澶辫触锛屽綋鍓嶄换鍔′笉鏄緭閫佺嚎鎵ц涓紝WCS涓婃姤瀹屾垚澶辫触");
                             }
 
-                            
+
                         }
                         else
                         {
                             //鍒ゆ柇鏄惁鏈夎绔欏彴
-                            if (task.TaskStatus == (int)InTaskStatusEnum.PLC_InExecuting)
+                            if (task.TaskStatus == (int)InTaskStatusEnum.PLC_InExecuting || task.TaskStatus == (int)InTaskStatusEnum.InPLCException)
                             {
                                 string Resultplc = MesInTaskStatusEnum.Finish.GetDescription();
                                 MES_parameter mES_PCLParameter = InStoreDocCallback(task.TaskNum, Resultplc, "鎿嶄綔鎴愬姛", task.PalletCode, task.TargetAddress);
@@ -210,21 +323,28 @@
                                     _unitOfWorkManage.BeginTran();
                                     BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
                                     _unitOfWorkManage.CommitTran();
+                                    WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"杈撻�佺嚎鐐瑰埌鐐瑰畬鎴�", $"鎴愬姛锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"杈撻�佺嚎浠诲姟宸插弽棣堣嚦涓婃父");
                                     return content.OK($"杈撻�佺嚎浠诲姟宸插弽棣堣嚦涓婃父锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                                 }
                                 else
                                 {
+                                    task.NumberSsuances = 3;
+                                    task.TaskStatus = (int)InTaskStatusEnum.InPLCException;
+                                    task.Remark = "杈撻�佺嚎鍏ュ簱锛氫笂浼燤ES澶辫触锛屽師鍥狅細" + mES_PCLParameter.ResultMsg;
+                                    BaseDal.UpdateData(task);
+                                    WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"杈撻�佺嚎鐐瑰埌鐐瑰畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"杈撻�佺嚎浠诲姟宸插弽棣堣嚦涓婃父");
                                     return content.Error("涓婁紶MES澶辫触锛屽師鍥狅細" + mES_PCLParameter.ResultMsg);
                                 }
                             }
                             else
                             {
+                                WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"杈撻�佺嚎鐐瑰埌鐐瑰畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婃姤澶辫触锛屽綋鍓嶄换鍔′笉鏄緭閫佺嚎鎵ц涓紝WCS涓婃姤瀹屾垚澶辫触");
                                 return content.Error($"涓婃姤澶辫触锛屽綋鍓嶄换鍔′笉鏄緭閫佺嚎鎵ц涓紝WCS涓婃姤瀹屾垚澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                             }
 
                         }
                     case 2:
-                        if (task.TaskStatus == (int)InTaskStatusEnum.SC_IntExecuting)
+                        if (task.TaskStatus == (int)InTaskStatusEnum.SC_IntExecuting || task.TaskStatus == (int)InTaskStatusEnum.InSCException)
                         {
                             string Resultsc = MesInTaskStatusEnum.Finish.GetDescription();
                             //涓婃姤MES浠诲姟瀹屾垚
@@ -243,25 +363,35 @@
                                 _locationInfoService.UpdateData(dt_LocationInfo);
                                 BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
                                 _unitOfWorkManage.CommitTran();
+
+                                WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"鎴愬姛锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"淇敼鍚庣殑搴撳瓨锛歿dt_Stockowc.ToJson()},淇敼鍚庣殑搴撲綅淇℃伅锛歿dt_LocationInfo.ToJson()}");
                                 return content.OK($"宸叉帴鏀跺叆搴撳爢鍨涙満瀹屾垚淇℃伅锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                             }
                             else
                             {
+                                task.NumberSsuances = 3;
+                                task.TaskStatus = (int)InTaskStatusEnum.InSCException;
+                                task.Remark = "鍫嗗灈鏈哄叆搴擄紝涓婁紶MES澶辫触锛屽師鍥狅細" + mES_Parameter.ResultMsg;
+                                BaseDal.UpdateData(task);
+                                WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婁紶MES澶辫触锛屽師鍥狅細{mES_Parameter.ResultMsg}");
                                 return content.Error("涓婁紶MES澶辫触锛屽師鍥狅細" + mES_Parameter.ResultMsg);
                             }
                         }
                         else
                         {
+                            WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婃姤澶辫触锛屽綋鍓嶄换鍔′笉鏄爢鍨涙満鎵ц涓紝WCS涓婃姤瀹屾垚澶辫触");
                             return content.Error($"涓婃姤澶辫触锛屽綋鍓嶄换鍔′笉鏄爢鍨涙満鎵ц涓紝WCS涓婃姤瀹屾垚澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                         }
-                            
+
                     default:
+                        WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"WCS涓婃姤绫诲瀷閿欒锛歿wcsTaskType}");
                         return content.Error($"WCS涓婃姤绫诲瀷閿欒锛歿wcsTaskType}");
                 }
             }
             catch (Exception ex)
             {
                 _unitOfWorkManage.RollbackTran();
+                WriteLog.Write_Log("WCS_鍏ュ簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触,浠诲姟鍙凤細{task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"WCS浠诲姟瀹屾垚鎺ュ彛鏁呴殰锛屽師鍥狅細{ex.Message}");
                 return content.Error($"WCS浠诲姟瀹屾垚鎺ュ彛鏁呴殰锛屽師鍥狅細{ex.Message}");
             }
         }
@@ -274,7 +404,7 @@
                 switch (wcsTaskType)
                 {
                     case 1:
-                        if(task.TaskStatus == (int)OutTaskStatusEnum.PLC_OutExecuting)
+                        if (task.TaskStatus == (int)OutTaskStatusEnum.PLC_OutExecuting || task.TaskStatus == (int)OutTaskStatusEnum.OutPLCException)
                         {
                             string Resultplc = MesOutTaskStatusEnum.Finish.GetDescription();
                             //涓婃姤MES浠诲姟瀹屾垚
@@ -283,22 +413,30 @@
                             {
                                 task.TaskStatus = (int)OutTaskStatusEnum.PLC_OutFinish;
                                 BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+
+                                WriteLog.Write_Log("WCS_鍑哄簱_涓婃姤瀹屾垚", $"杈撻�佺嚎瀹屾垚",$"鎴愬姛,浠诲姟鍙凤細{task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"宸叉帴鏀跺嚭搴撹緭閫佺嚎瀹屾垚淇℃伅");
                                 return content.OK($"宸叉帴鏀跺嚭搴撹緭閫佺嚎瀹屾垚淇℃伅锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                             }
                             else
                             {
+                                task.NumberSsuances =3;
+                                task.TaskStatus = (int)OutTaskStatusEnum.OutPLCException;
+                                task.Remark = "鍑哄簱锛岃緭閫佺嚎涓婁紶MES澶辫触锛屽師鍥狅細" + mES_Parameter.ResultMsg;
+                                BaseDal.UpdateData(task);
+                                WriteLog.Write_Log("WCS_鍑哄簱_涓婃姤瀹屾垚", $"杈撻�佺嚎瀹屾垚", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婁紶MES澶辫触锛屽師鍥狅細{mES_Parameter.ResultMsg}");
                                 return content.Error("涓婁紶MES澶辫触锛屽師鍥狅細" + mES_Parameter.ResultMsg);
                             }
 
                         }
                         else
                         {
+                            WriteLog.Write_Log("WCS_鍑哄簱_涓婃姤瀹屾垚", $"杈撻�佺嚎瀹屾垚", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婃姤澶辫触锛學MS褰撳墠浠诲姟涓嶆槸杈撻�佺嚎鎵ц涓紝WCS涓婃姤瀹屾垚澶辫触");
                             return content.Error($"涓婃姤澶辫触锛學MS褰撳墠浠诲姟涓嶆槸杈撻�佺嚎鎵ц涓紝WCS涓婃姤瀹屾垚澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                         }
-                        
+
                     case 2:
 
-                        if (task.TaskStatus == (int)OutTaskStatusEnum.SC_OutExecuting)
+                        if (task.TaskStatus == (int)OutTaskStatusEnum.SC_OutExecuting || task.TaskStatus == (int)OutTaskStatusEnum.OutSCException)
                         {
                             //鑾峰彇瀵瑰簲PLC绔欏彴淇℃伅
                             Dt_roadwayinfo _Roadwayinfo = _roadWayinfoService.QbtainPlatform(task.Roadway);
@@ -320,25 +458,35 @@
                                 _locationInfoService.UpdateData(dt_LocationInfo);
                                 BaseDal.UpdateData(task);
                                 _unitOfWorkManage.CommitTran();
+                                WriteLog.Write_Log("WCS_鍑哄簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�",$"鎴愬姛锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"鍒犻櫎鐨勫簱瀛橈細{dt_Stockowc.ToJson()},淇敼鐨勮揣浣嶏細{dt_LocationInfo.ToJson()}");
+
                                 return content.OK($"宸叉帴鏀跺嚭搴撳爢鍨涙満瀹屾垚淇℃伅锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                             }
                             else
                             {
+                                task.NumberSsuances = 3;
+                                task.TaskStatus = (int)OutTaskStatusEnum.OutSCException;
+                                task.Remark = "鍫嗗灈鏈哄嚭搴擄細涓婁紶MES澶辫触锛屽師鍥狅細" + mES_SCParameter.ResultMsg;
+                                BaseDal.UpdateData(task);
+                                WriteLog.Write_Log("WCS_鍑哄簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婁紶MES澶辫触锛屽師鍥狅細{mES_SCParameter.ResultMsg}");
                                 return content.Error("涓婁紶MES澶辫触锛屽師鍥狅細" + mES_SCParameter.ResultMsg);
                             }
                         }
                         else
                         {
+                            WriteLog.Write_Log("WCS_鍑哄簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触,浠诲姟鍙凤細{task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婃姤澶辫触锛學MS褰撳墠浠诲姟涓嶆槸鍫嗗灈鏈烘墽琛屼腑锛學CS涓婃姤瀹屾垚澶辫触");
                             return content.Error($"涓婃姤澶辫触锛學MS褰撳墠浠诲姟涓嶆槸鍫嗗灈鏈烘墽琛屼腑锛學CS涓婃姤瀹屾垚澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                         }
-                        
+
                     default:
+                        WriteLog.Write_Log("WCS_鍑哄簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"WCS涓婃姤绫诲瀷閿欒锛歿wcsTaskType}");
                         return content.Error($"WCS涓婃姤绫诲瀷閿欒锛歿wcsTaskType}");
                 }
             }
             catch (Exception ex)
             {
                 _unitOfWorkManage.RollbackTran();
+                WriteLog.Write_Log("WCS_鍑哄簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"WCS浠诲姟瀹屾垚鎺ュ彛鏁呴殰锛屽師鍥狅細{ex.Message}");
                 return content.Error($"WCS浠诲姟瀹屾垚鎺ュ彛鏁呴殰锛屽師鍥狅細{ex.Message}");
             }
         }
@@ -350,12 +498,14 @@
             {
                 if (wcsTaskType == 2)
                 {
-                    if(task.TaskStatus == (int)RelocationTaskStatusEnum.RelocationExecuting)
+                    if (task.TaskStatus == (int)RelocationTaskStatusEnum.RelocationExecuting)
                     {
                         //涓婃姤MES浠诲姟瀹屾垚
                         MES_parameter mES_Parameter = AbnormalStorageLocation(task.PalletCode, task.SourceAddress, task.TargetAddress);
                         if (mES_Parameter.Result == "Y")
                         {
+                            Dt_Task dtOutWit=BaseDal.QueryData(x=>x.PalletCode==task.PalletCode && x.TaskStatus== (int)OutTaskStatusEnum.OutWait).FirstOrDefault();
+
                             Dt_LocationInfo OriginalLocation = _locationInfoService.Repository.QueryData(x => x.LocationCode == task.SourceAddress).FirstOrDefault();
                             Dt_LocationInfo NewLocation = _locationInfoService.Repository.QueryData(x => x.LocationCode == task.TargetAddress).FirstOrDefault();
                             Dt_StockInfo dt_StockInfo = _stockInfoService.Repository.QueryData(x => x.LocationCode == task.SourceAddress).FirstOrDefault();
@@ -363,48 +513,292 @@
                             List<Dt_LocationInfo> dt_Locations = new List<Dt_LocationInfo>();
 
                             OriginalLocation.LocationStatus = (int)LocationStatusEnum.Free;
-                            NewLocation.LocationStatus = (int)LocationStatusEnum.InStock;
+                            NewLocation.LocationStatus = dtOutWit != null? (int)LocationStatusEnum.Lock:(int)LocationStatusEnum.InStock;
                             dt_StockInfo.LocationCode = NewLocation.LocationCode;
-                            dt_StockInfo.StockStatus = (int)StockStatusEmun.宸插叆搴�;
+                            dt_StockInfo.StockStatus = dtOutWit != null? (int)StockStatusEmun.鍑哄簱涓�:(int)StockStatusEmun.宸插叆搴�;
                             task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationFinish;
+
+                            if(dtOutWit != null)
+                            {
+                                dtOutWit.TaskStatus = (int)OutTaskStatusEnum.OutNew;
+                                dtOutWit.SourceAddress = NewLocation.LocationCode;
+                                dtOutWit.CurrentAddress = NewLocation.LocationCode;
+                            }
+                            
+
+
 
                             dt_Locations.Add(OriginalLocation);
                             dt_Locations.Add(NewLocation);
 
                             _unitOfWorkManage.BeginTran();
+                            if(dtOutWit!=null) BaseDal.UpdateData(dtOutWit);
+
                             _locationInfoService.UpdateData(dt_Locations);
                             _stockInfoService.UpdateData(dt_StockInfo);
                             BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
                             _unitOfWorkManage.CommitTran();
 
+                            WriteLog.Write_Log("WCS_绉诲簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"鎴愬姛,浠诲姟鍙凤細{task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"淇敼鐨勮揣浣嶏細{dt_Locations.ToJson()},淇敼鐨勫簱瀛橈細{dt_StockInfo.ToJson()}");
                             return responseContent.OK($"宸叉帴鏀剁Щ搴撳爢鍨涙満瀹屾垚淇℃伅锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                         }
                         else
                         {
+                            task.NumberSsuances = 3;
+                            task.TaskStatus = (int)RelocationTaskStatusEnum.RelocationException;
+                            task.Remark = "绉诲簱锛屼笂浼燤ES澶辫触锛屽師鍥狅細" + mES_Parameter.ResultMsg;
+                            BaseDal.UpdateData(task);
+                            WriteLog.Write_Log("WCS_绉诲簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婁紶MES澶辫触锛屽師鍥狅細{mES_Parameter.ResultMsg}");
                             return responseContent.Error("涓婁紶MES澶辫触锛屽師鍥狅細" + mES_Parameter.ResultMsg);
                         }
                     }
                     else
                     {
+                        WriteLog.Write_Log("WCS_绉诲簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"涓婃姤澶辫触锛學MS褰撳墠浠诲姟涓嶆槸鍫嗗灈鏈烘墽琛屼腑锛學CS涓婃姤瀹屾垚澶辫触");
                         return responseContent.Error($"涓婃姤澶辫触锛學MS褰撳墠浠诲姟涓嶆槸鍫嗗灈鏈烘墽琛屼腑锛學CS涓婃姤瀹屾垚澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}");
                     }
-                    
+
                 }
                 else
                 {
+                    WriteLog.Write_Log("WCS_绉诲簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"WCS涓婃姤绫诲瀷閿欒锛歿wcsTaskType}");
                     return responseContent.Error($"WCS涓婃姤绫诲瀷閿欒锛歿wcsTaskType}");
                 }
             }
             catch (Exception ex)
             {
                 _unitOfWorkManage.RollbackTran();
+                WriteLog.Write_Log("WCS_绉诲簱_涓婃姤瀹屾垚", $"鍫嗗灈鏈哄畬鎴�", $"澶辫触锛屼换鍔″彿锛歿task.TaskId},鎵樼洏缂栧彿锛歿task.PalletCode}", $"WCS浠诲姟瀹屾垚鎺ュ彛鏁呴殰锛屽師鍥狅細{ex.Message}");
                 return responseContent.Error($"WMS绯荤粺閿欒锛屽師鍥狅細{ex.Message}");
             }
-            
+
+        }
+
+        #endregion
+
+
+
+        //浠诲姟浠诲姟鎭㈠
+        public WebResponseContent WMSTaskRecovery(SaveModel saveModel)
+        {
+            WebResponseContent response = new WebResponseContent();
+            List<Dt_Task> dt_Task = new List<Dt_Task>();
+            try
+            {
+                foreach (var key in saveModel.DelKeys)
+                {
+                    int taskId = int.Parse(key.ToString());
+                    Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == taskId);
+                    if (task == null)
+                            return response.Error("鏈壘鍒颁换鍔′俊鎭�");
+                    task.NumberSsuances = 0;
+                    task.Remark = "";
+                    dt_Task.Add(task);
+                }
+                bool updatetask= BaseDal.UpdateData(dt_Task);
+                if (updatetask)
+                {
+                    WriteLog.Write_Log("WMS_浠诲姟鎭㈠", $"WMS_浠诲姟鎭㈠", "淇敼鎴愬姛", $"淇敼鐨勬暟鎹細{dt_Task.ToJson()}");
+                    return response.OK("鎵�鏈変换鍔″鐞嗘垚鍔�");
+                }
+                else
+                {
+                    WriteLog.Write_Log("WMS_浠诲姟鎭㈠", $"WMS_浠诲姟鎭㈠", "淇敼澶辫触", $"淇敼鐨勬暟鎹細{dt_Task.ToJson()}");
+                    return response.Error("澶勭悊澶辫触锛屼慨鏀逛换鍔″け璐�");
+                }
+
+                
+            }
+            catch (Exception ex)
+            {
+                WriteLog.Write_Log("WMS_浠诲姟鎭㈠", $"WMS_浠诲姟鎭㈠", "淇敼澶辫触", $"淇敼鐨勬暟鎹細{dt_Task.ToJson()}锛屽け璐ュ師鍥狅細{ex.Message}");
+                return response.Error($"WMS浠诲姟鎭㈠閿欒锛歿ex.Message}");
+            }
         }
 
 
+        public virtual WebResponseContent UpdateData(SaveModel saveModel)
+        {
+            try
+            {
+                List<string>? list = UpdateIgnoreColOnExecute?.Invoke(saveModel);
+                if (saveModel == null || saveModel.MainData == null || saveModel.MainData.Count == 0)//鍒ゆ柇鍙傛暟鏄惁浼犲叆
+                {
+                    return WebResponseContent.Instance.Error("浼犲弬閿欒,鍙傛暟涓嶈兘涓虹┖");
+                }
+                string validResult = typeof(Dt_Task).ValidateDicInEntity(saveModel.MainData, false, TProperties, list?.ToArray() ?? null);
+
+                if (!string.IsNullOrEmpty(validResult))
+                {
+                    return WebResponseContent.Instance.Error(validResult);
+                }
+
+                PropertyInfo keyPro = typeof(Dt_Task).GetKeyProperty();
+                if (keyPro == null)
+                {
+                    return WebResponseContent.Instance.Error("璇峰厛璁剧疆涓婚敭");
+                }
+
+                Dt_Task entity = saveModel.MainData.DicToModel<Dt_Task>();
+                Dt_Task Dt_Custask= BaseDal.QueryFirst(x=>x.TaskId==entity.TaskId);
+
+                List<string> listCol = new List<string>();
+                foreach (var item in saveModel.MainData)
+                {
+                    PropertyInfo? propertyInfo = typeof(Dt_Task).GetProperty(item.Key);
+                    if (propertyInfo == null)
+                    {
+                        propertyInfo = typeof(Dt_Task).GetProperty(item.Key.FirstLetterToLower());
+                        if (propertyInfo == null)
+                        {
+                            propertyInfo = typeof(Dt_Task).GetProperty(item.Key.FirstLetterToUpper());
+                        }
+                    }
+
+                    listCol.Add(propertyInfo?.Name);
+                }
+
+                if (saveModel.DetailData == null || saveModel.DetailData.Count == 0)
+                {
+                    if (list != null)
+                        listCol = listCol.Where(x => !list.Contains(x)).ToList();
+                    bool result = BaseDal.UpdateData(entity, listCol, list);
+                    WriteLog.Write_Log("WMS_浠诲姟淇敼", $"浠诲姟淇敼", $"浠诲姟缂栧彿:{entity.TaskId},鎵樼洏鏉$爜锛歿entity.PalletCode},鏄惁鎴愬姛锛歿result}", $"鍘熸潵鏁版嵁锛歿Dt_Custask.ToJson()}======>>>>>>淇敼鍚庣殑鏁版嵁锛歿entity.ToJson()}");
+                    return WebResponseContent.Instance.OK();
+                }
+
+                if (typeof(Dt_Task).GetNavigatePro() == null)
+                {
+                    return WebResponseContent.Instance.Error("鏈厤缃鑸睘鎬�");
+                }
+
+                Type detailType = typeof(Dt_Task).GetDetailType();
+                MethodInfo? methodInfo = GetType().GetMethod("UpdateDataInculdesDetail");
+                methodInfo = methodInfo?.MakeGenericMethod(new Type[] { detailType });
+                object? obj = methodInfo?.Invoke(this, new object[] { entity, detailType, saveModel.DetailData, saveModel.DelKeys });
+                return obj as WebResponseContent;
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+    
         
 
+
+        //浠诲姟鑾峰彇
+        public List<Dt_Task> GetaskQueue(string deviceId)
+        {
+            return BaseDal.QueryData(x => x.Roadway == deviceId
+                           && (x.TaskStatus == (int)InTaskStatusEnum.PLC_InFinish
+                               || x.TaskStatus == (int)OutTaskStatusEnum.OutNew)
+                           && x.NumberSsuances == 0)
+               .OrderBy(x => x.Remark == null ? 0 : 1)
+               .ToList();
+            //return BaseDal.QueryData(x => x.Roadway == deviceId && (x.TaskStatus == (int)InTaskStatusEnum.PLC_InFinish || x.TaskStatus == (int)OutTaskStatusEnum.OutNew) && x.NumberSsuances==0);
+        }
+
+        //鑾峰彇褰撳墠鍫嗗灈鏈烘墽琛岀殑浠诲姟
+        public bool CurrentTaskProgress(string deviceId)
+        {
+           int taskcount=BaseDal.QueryData(x => x.Roadway == deviceId && (x.TaskStatus == (int)InTaskStatusEnum.SC_IntExecuting || x.TaskStatus == (int)OutTaskStatusEnum.SC_OutExecuting || x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationExecuting)).Count();
+            if (taskcount == 0) return false;
+            return true;
+        }
+
+        //鑾峰彇鍫嗗灈鏈哄畬鎴愶紝涓嬪彂杈撻�佺嚎鐨勪换鍔�
+        public static List<string> OutSCList = new List<string>() { "1109", "1105", "1210", "1212", "1214" };
+        public List<Dt_Task> GetaskQueuePLC()
+        {
+            return BaseDal.QueryData(x => x.TaskStatus == (int)OutTaskStatusEnum.SC_OutFinish && OutSCList.Contains(x.CurrentAddress));
+        }
+
+        //鑾峰彇鏄惁鏈夌Щ搴撶殑浠诲姟
+        public Dt_Task GeRelocationTaskQueue(string LocationCode)
+        {
+            return BaseDal.QueryData(x => x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationNew && x.CurrentAddress == LocationCode).FirstOrDefault();
+        }
+
+        public Dt_Task GeOutCuTaskQueue(string LocationCode)
+        {
+            return BaseDal.QueryData(x => x.TaskStatus == (int)OutTaskStatusEnum.OutNew && x.SourceAddress == LocationCode).FirstOrDefault();
+        }
+
+        public bool RelocationTaskProgress(string deviceId)
+        {
+            int taskcount = BaseDal.QueryData(x => x.Roadway == deviceId && (x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationExecuting || x.TaskStatus == (int)RelocationTaskStatusEnum.RelocationNew) ).Count();
+            if (taskcount == 0) return false;
+            return true;
+        }
+
+        //浠撳簱瀹归噺鐘舵��
+        public WebResponseContent GetWarehouseCapacity()
+        {
+            return _locationInfoService.GetWarehouseCapacity();
+        }
+
+        //鍑哄叆搴撶被鍨嬪垎甯�
+        public WebResponseContent GetInOutTypeStats()
+        {
+            return _task_HtyService.GetInOutTypeStats();
+        }
+        //娴侀噺鎯呭喌缁熻
+
+        public WebResponseContent GetTodayTrafficStats()
+        {
+            return _task_HtyService.GetTodayInOutStats();
+        }
+        //褰撳墠杩涜鐨勪换鍔�
+        public WebResponseContent GetCurrentTasks()
+        {
+            // 鏌ヨ鎵�浠ヨ繑鍥濼askNum锛孴askType锛孋reateDate锛孴askStatus锛�
+            var tasks = BaseDal.QueryData()
+                        .Select(t => new
+                        {
+                            WarehouseId = t.Roadway == "1" || t.Roadway == "2" ? 1 : 2,
+                            PalletType = t.PalletType,
+                            TaskNum = t.TaskId,
+                            TaskType = t.TaskType,
+                            CreateDate = t.CreateDate,
+                            TaskStatus = t.TaskStatus,
+                            TargetAddress = t.TargetAddress
+                        })
+                        .ToList();
+            return WebResponseContent.Instance.OK("鎴愬姛", tasks);
+        }
+        //鎬讳綋杩涘害
+        public WebResponseContent GetWarehouseOperationStatistics()
+        {
+            /// <summary>
+            /// 鍘熸枡浠擄紝鎬诲嚭鍏ュ簱浠诲姟鏁伴噺锛屼粖鏃ュ叆搴擄紝浠婃棩鍑哄簱锛屼粖鏃ュ緟瀹屾垚锛屼粖鏃ュ紓甯镐换鍔★紝鎴愬搧浠擄紝鎬诲嚭鍏ュ簱鏁伴噺锛屼粖鏃ュ叆搴擄紝浠婃棩鍑哄簱锛屼粖鏃ュ緟瀹屾垚
+            /// </summary>
+            return _task_HtyService.GetWarehouseOperationStatistics();
+        }
+
+        public WebResponseContent GetTaskDestination(string targetAddress)
+        {
+            WebResponseContent content = new WebResponseContent();
+            // 鍙傛暟鏍¢獙
+            if (string.IsNullOrWhiteSpace(targetAddress))
+            {
+                return content.Error("鐩爣鍦板潃涓嶈兘涓虹┖");
+            }
+            try
+            {
+                // 鏌ヨ鏁版嵁
+                var queryResult = BaseDal.QueryData(x => x.TargetAddress == targetAddress);
+                // 鍒ゆ柇鏌ヨ缁撴灉
+                if (queryResult == null || !queryResult.Any())
+                {
+                    return content.Error($"鏈壘鍒扮洰鏍囧湴鍧�涓篬{targetAddress}]鐨勪换鍔�");
+                }
+                return content.OK($"鏈夌洰鏍囧湴鍧�涓篬{targetAddress}]鐨勪换鍔★紝璇锋嫤鎴�");
+            }
+            catch (Exception ex)
+            {
+                return content.Error($"鑾峰彇浠诲姟鐩殑鍦板け璐�: {ex.Message}");
+            }
+        }
     }
 }

--
Gitblit v1.9.3