From e46aa927d231af83724683c7286d9db503e24cf7 Mon Sep 17 00:00:00 2001
From: z8018 <1282578289@qq.com>
Date: 星期二, 10 六月 2025 11:46:20 +0800
Subject: [PATCH] 1

---
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs |  501 ++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 438 insertions(+), 63 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
index e84f46d..9684e51 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
@@ -15,11 +15,13 @@
  *----------------------------------------------------------------*/
 #endregion << 鐗� 鏈� 娉� 閲� >>
 
+using System.Collections.Generic;
 using System.Text;
 using System.Threading.Tasks;
 using AutoMapper;
 using HslCommunication;
 using HslCommunication.WebSocket;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
 using SqlSugar;
 using WIDESEAWCS_BasicInfoRepository;
 using WIDESEAWCS_BasicInfoService;
@@ -42,17 +44,70 @@
 
 namespace WIDESEAWCS_TaskInfoService
 {
+    /// <summary>
+    /// 浠诲姟鏈嶅姟绫伙紝鎻愪緵浠诲姟鐩稿叧鐨勪笟鍔¢�昏緫鎿嶄綔
+    /// </summary>
+    /// <remarks>
+    /// 涓昏鍔熻兘鍖呮嫭锛� <br/>
+    /// 1. 鏌ヨ闂ㄦ灦璁惧鏈墽琛屼换鍔� <br/>
+    /// 2. 鎵ц璁㈠崟鍧楁斁缃祴璇� <br/>
+    /// 3. 鍒涘缓鍜岀鐞嗕换鍔� <br/>
+    /// 4. 鐢熸垚鍜岄噸鏂扮敓鎴愪换鍔� <br/>
+    /// 5. 澶勭悊寮傚父浠诲姟 <br/>
+    /// 6. 浠诲姟瀹屾垚澶勭悊 <br/>
+    /// 渚濊禆浠撳偍灞傝繘琛屾暟鎹闂紝閫氳繃宸ヤ綔鍗曞厓绠$悊浜嬪姟 <br/>
+    /// 浣跨敤WebSocket杩涜瀹炴椂閫氱煡锛屽苟鍖呭惈瀹屾暣鐨勫紓甯稿鐞嗘満鍒�
+    /// </remarks>
     public class TaskService : ServiceBase<Dt_Task, ITaskRepository>, ITaskService
     {
+        /// <summary>
+        /// 宸ヤ綔鍗曞厓绠$悊鎺ュ彛瀹炰緥锛岀敤浜庣鐞嗘暟鎹簱浜嬪姟鍜屽伐浣滃崟鍏�
+        /// </summary>
         private readonly IUnitOfWorkManage _unitOfWorkManage;
+
+        /// <summary>
+        /// 鐢ㄤ簬瀵硅薄鏄犲皠鐨勬槧灏勫櫒瀹炰緥
+        /// </summary>
         private readonly IMapper _mapper;
+
+        /// <summary>
+        /// 瀹瑰櫒浠撳偍鎺ュ彛瀹炰緥锛岀敤浜庡鍣ㄧ浉鍏虫暟鎹搷浣�
+        /// </summary>
         private readonly IContainerRepository _containerRepository;
+
+        /// <summary>
+        /// 瀹瑰櫒鐗╁搧浠撳偍鎺ュ彛瀹炰緥锛堝彧璇伙級
+        /// </summary>
         private readonly IContainerItemRepository _containerItemRepository;
+
+        /// <summary>
+        /// WebSocket鏈嶅姟鍣ㄥ疄渚嬶紝鐢ㄤ簬澶勭悊WebSocket杩炴帴
+        /// </summary>
         private readonly WebSocketServer _webSocketServer;
+
+        /// <summary>
+        /// 璁㈠崟璇︽儏浠撳偍鎺ュ彛瀹炰緥锛堝彧璇伙級
+        /// </summary>
         private readonly IOrderDetailsRepository _orderDetailsRepository;
+
+        /// <summary>
+        /// 瀹瑰櫒鏈嶅姟鎺ュ彛瀹炰緥锛岀敤浜庣鐞嗕緷璧栨敞鍏ュ鍣ㄧ浉鍏虫搷浣�
+        /// </summary>
         private readonly IContainerService _containerService;
+
+        /// <summary>
+        /// 璁㈠崟鏄庣粏鏈嶅姟鎺ュ彛
+        /// </summary>
         private readonly IOrderDetailsService _orderDetailsService;
+
+        /// <summary>
+        /// 璁㈠崟琛屼粨鍌ㄦ帴鍙e疄渚嬶紝鐢ㄤ簬鎿嶄綔璁㈠崟琛屾暟鎹�
+        /// </summary>
         private readonly IOrderrowsRepository _orderrowsRepository;
+
+        /// <summary>
+        /// 璁㈠崟瀹瑰櫒浠撳偍鎺ュ彛瀹炰緥锛岀敤浜庢搷浣滆鍗曞鍣ㄧ浉鍏虫暟鎹�
+        /// </summary>
         private readonly IOrderContainerRepository _orderContainerRepository;
 
         public TaskService(ITaskRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper, IContainerRepository containerRepository, IContainerItemRepository containerItemRepository, WebSocketServer webSocketServer, IOrderDetailsRepository orderDetailsRepository, IContainerService containerService, IOrderDetailsService orderDetailsService, IOrderrowsRepository orderrowsRepository, IOrderContainerRepository orderContainerRepository) : base(BaseDal)
@@ -69,11 +124,28 @@
             _orderContainerRepository = orderContainerRepository;
         }
 
+        /// <summary>
+        /// 鏌ヨ鎸囧畾闂ㄦ灦璁惧鏈墽琛岀殑浠诲姟
+        /// </summary>
+        /// <param name="gantryDeviceNo">闂ㄦ灦璁惧缂栧彿</param>
+        /// <returns>鏈墽琛岀殑浠诲姟鏁版嵁锛岃嫢涓嶅瓨鍦ㄥ垯杩斿洖null</returns>
         public Dt_Task? QueryAGantryUnExecuteTask(string gantryDeviceNo)
         {
             return BaseDal.QueryFirst(x => x.TaskState == (int)TaskStatusEnum.Gantry_New && x.DeviceCode == gantryDeviceNo);
         }
 
+        /// <summary>
+        /// 鎵ц璁㈠崟鍧楁斁缃祴璇曪紝鏍规嵁璁㈠崟琛孖D鑾峰彇璁㈠崟鏄庣粏骞惰绠楁斁缃綅缃�
+        /// </summary>
+        /// <param name="orderRowId">璁㈠崟琛孖D</param>
+        /// <returns>鍖呭惈鏀剧疆鍧椾俊鎭殑Web鍝嶅簲鍐呭銆傛垚鍔熸椂杩斿洖鏀剧疆鍧楀垪琛紝澶辫触鏃惰繑鍥為敊璇俊鎭�</returns>
+        /// <remarks>
+        /// 1. 閫氳繃璁㈠崟琛孖D鏌ヨ璁㈠崟鏄庣粏鏁版嵁 <br/>
+        /// 2. 瀵规瘡涓湁鏁堣鍗曟槑缁嗚绠楀悎閫傜殑鏀剧疆浣嶇疆 <br/>
+        /// 3. 鍒涘缓瀹瑰櫒椤瑰拰浠诲姟璁板綍 <br/>
+        /// 4. 閫氳繃WebSocket鍙戝竷鏀剧疆浣嶇疆淇℃伅 <br/>
+        /// 5. 杩斿洖鎵�鏈夋垚鍔熸斁缃殑鍧椾俊鎭�
+        /// </remarks>
         public WebResponseContent PlaceBlockTest(int orderRowId)
         {
             try
@@ -97,11 +169,6 @@
                             int length = Convert.ToInt32(orderDetails[i].Orderdetails_length);
                             int width = Convert.ToInt32(orderDetails[i].Orderdetails_width);
                             int height = Convert.ToInt32(orderDetails[i].Orderdetails_thickness);
-
-                            if (length < 300 || width < 50)
-                            {
-                                continue;
-                            }
 
                             OrderInfo orderInfo = _orderDetailsService.GetOrderInfoByBarcode(orderDetails[i].Orderdetails_outid);
 
@@ -137,7 +204,18 @@
                                         ContainerId = putContainer.Id,
                                         OrderNo = orderInfo.OrderNo,
                                     };
-                                    orderContainer.MaxLength = putContainer.ContainerLength;
+                                    int containerLength = putContainer.ContainerLength;
+                                    int containerWidth = putContainer.ContainerWidth;
+                                    int maxValue = Math.Max(length, width);
+                                    int minValue = Math.Min(length, width);
+                                    if (minValue > putContainer.ContainerWidth)
+                                    {
+                                        containerLength = maxValue;
+                                        containerWidth = minValue;
+                                    }
+
+                                    orderContainer.MaxLength = containerLength;
+                                    orderContainer.MaxWidth = containerWidth;
                                     isAdd = true;
                                 }
 
@@ -187,13 +265,14 @@
                                     PlacedBlock placedBlock = new PlacedBlock(new Point3D(taskPosition.PositionX, taskPosition.PositionY, taskPosition.PositionZ), length > width ? length : width, width > length ? length : width, height);
                                     placedBlocks.Add(placedBlock);
 
+                                    Thread.Sleep(1000);
                                     object obj = new
                                     {
                                         x = taskPosition.PutCenterPositionX - putContainer.ContainerLength / 2,
                                         y = taskPosition.PutCenterPositionY - putContainer.ContainerWidth / 2,
-                                        z = taskPosition.PutCenterPositionZ,
-                                        length,
-                                        width,
+                                        z = taskPosition.PutPositionZ,
+                                        length = length > width ? length : width,
+                                        width = width > length ? length : width,
                                         height,
                                     };
                                     _webSocketServer.PublishAllClientPayload(obj.Serialize());
@@ -214,6 +293,22 @@
             }
         }
 
+        /// <summary>
+        /// 鍒涘缓浠诲姟骞惰绠楃墿鍝佹斁缃綅缃�
+        /// </summary>
+        /// <param name="takePosition">鍙栬揣浣嶇疆缂栫爜</param>
+        /// <param name="putPosition">鏀捐揣浣嶇疆缂栫爜</param>
+        /// <param name="deviceCode">璁惧缂栫爜</param>
+        /// <param name="length">鐗╁搧闀垮害</param>
+        /// <param name="width">鐗╁搧瀹藉害</param>
+        /// <param name="height">鐗╁搧楂樺害</param>
+        /// <returns>鍖呭惈鎿嶄綔缁撴灉鐨刉eb鍝嶅簲鍐呭</returns>
+        /// <remarks>
+        /// 1. 楠岃瘉鍙栬揣/鏀捐揣浣嶇疆鏄惁瀛樺湪 <br/>
+        /// 2. 璁$畻鐗╁搧鍦ㄥ鍣ㄤ腑鐨勬渶浣虫斁缃綅缃� <br/>
+        /// 3. 鍒涘缓瀹瑰櫒鐗╁搧璁板綍鍜屼换鍔¤褰� <br/>
+        /// 4. 閫氳繃WebSocket閫氱煡瀹㈡埛绔�
+        /// </remarks>
         public WebResponseContent CreateTask(string takePosition, string putPosition, string deviceCode, int length, int width, int height)
         {
             try
@@ -306,6 +401,22 @@
             }
         }
 
+        /// <summary>
+        /// 鏍规嵁璁㈠崟淇℃伅鐢熸垚浠诲姟
+        /// </summary>
+        /// <param name="orderInfo">璁㈠崟淇℃伅</param>
+        /// <returns>鍖呭惈涓変釜鍊肩殑鍏冪粍锛� <br/>
+        /// Item1 - 鎿嶄綔鏄惁鎴愬姛 (bool) <br/>
+        /// Item2 - 鐢熸垚鐨勪换鍔″璞� (Dt_Task)锛屽け璐ユ椂涓簄ull <br/>
+        /// Item3 - 閿欒娑堟伅 (string)锛屾垚鍔熸椂涓虹┖瀛楃涓�
+        /// </returns>
+        /// <remarks>
+        /// 璇ユ柟娉曚細锛� <br/>
+        /// 1. 鏍规嵁璁㈠崟灏哄鑾峰彇鍚堥�傜殑璐т綅 <br/>
+        /// 2. 鍒涘缓瀹瑰櫒椤瑰拰浠诲姟璁板綍 <br/>
+        /// 3. 鏇存柊鐩稿叧瀹瑰櫒鐘舵�� <br/>
+        /// 4. 鍦ㄤ簨鍔′腑鎵ц鎵�鏈夋暟鎹簱鎿嶄綔
+        /// </remarks>
         public (bool, Dt_Task?, string) GenerateTask(OrderInfo orderInfo)
         {
             try
@@ -342,7 +453,19 @@
                             ContainerId = putContainer.Id,
                             OrderNo = orderInfo.OrderNo,
                         };
-                        orderContainer.MaxLength = putContainer.ContainerLength;
+
+                        int containerLength = putContainer.ContainerLength;
+                        int containerWidth = putContainer.ContainerWidth;
+                        int maxValue = Math.Max(length, width);
+                        int minValue = Math.Min(length, width);
+                        if (minValue > putContainer.ContainerWidth)
+                        {
+                            containerLength = maxValue;
+                            containerWidth = minValue;
+                        }
+
+                        orderContainer.MaxLength = containerLength;
+                        orderContainer.MaxWidth = containerWidth;
                         isAdd = true;
                     }
 
@@ -396,7 +519,7 @@
                 }
                 else
                 {
-                    return (false, null, $"鏈壘鍒板彲鏀剧疆浣嶇疆,闇�瑕佹竻绌烘墠鍙斁缃�,{orderInfo.Serialize()}");
+                    return (false, null, message);
                 }
             }
             catch (Exception ex)
@@ -406,6 +529,259 @@
             }
         }
 
+        /// <summary>
+        /// 閲嶆柊鐢熸垚浠诲姟
+        /// </summary>
+        /// <param name="task">鍘熷浠诲姟瀵硅薄</param>
+        /// <param name="stationCode">宸ヤ綔绔欑紪鐮�</param>
+        /// <returns>
+        /// 鍖呭惈涓変釜鍊肩殑鍏冪粍锛� <br/>
+        /// 1. bool - 鎿嶄綔鏄惁鎴愬姛 <br/>
+        /// 2. Dt_Task - 鏇存柊鍚庣殑浠诲姟瀵硅薄锛堝け璐ユ椂涓簄ull锛� <br/>
+        /// 3. string - 閿欒娑堟伅锛堟垚鍔熸椂涓虹┖瀛楃涓诧級
+        /// </returns>
+        /// <remarks>
+        /// 璇ユ柟娉曠敤浜庨噸鏂扮敓鎴愪换鍔′俊鎭紝鍖呮嫭锛� <br/>
+        /// 1. 瑙f瀽鏉垮瓙灏哄淇℃伅 <br/>
+        /// 2. 楠岃瘉鍙栬揣/鏀捐揣浣嶇疆 <br/>
+        /// 3. 璁$畻鐗╁搧鏀剧疆浣嶇疆 <br/>
+        /// 4. 鏇存柊浠诲姟鐘舵�佸拰浣嶇疆淇℃伅 <br/>
+        /// 5. 鍦ㄤ簨鍔′腑鏇存柊鏁版嵁搴撹褰�
+        /// </remarks>
+        public (bool, Dt_Task?, string) RegenerateTask(Dt_Task task, string stationCode)
+        {
+            try
+            {
+                int length = 0;
+                int width = 0;
+                int height = 0;
+                Dt_ContainerItem containerItem = _containerItemRepository.QueryFirst(x => x.ItemCode == task.PalletCode);
+                if (containerItem == null)
+                {
+                    List<string> itemInfos = task.ItemInfo.Split("*").ToList();
+                    if (itemInfos.Count == 3)
+                    {
+                        length = Convert.ToInt32(itemInfos[0]);
+                        width = Convert.ToInt32(itemInfos[1]);
+                        height = Convert.ToInt32(itemInfos[2]);
+                    }
+                    else
+                    {
+                        return (false, null, "鏉垮瓙灏哄淇℃伅閿欒");
+                    }
+                }
+                else
+                {
+                    length = containerItem.ItemLength;
+                    width = containerItem.ItemWidth;
+                    height = containerItem.ItemHeight;
+                }
+                string containerCode = task.NextAddress.Split("*")[0];
+
+                Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == containerCode);
+
+                if (putContainer == null)
+                {
+                    return (false, null, "鏈壘鍒版斁璐т綅缃�");
+                }
+
+                Dt_Container? takeContainer = _containerRepository.QueryFirst(x => x.ContainerCode == stationCode);
+                if (takeContainer == null)
+                {
+                    return (false, null, "鏈壘鍒板彇璐т綅缃�");
+                }
+
+                var (flag, taskPosition, message) = _containerService.GetPosition(putContainer, length, width, height);
+                if (!flag || taskPosition == null)
+                {
+                    return (false, null, message);
+                }
+
+                Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.ContainerCode == putContainer.ContainerCode);
+
+                bool isAdd = false;
+
+                if (orderContainer == null)
+                {
+                    return (false, null, "鏈壘鍒拌鍗曚笌瀹瑰櫒缁戝畾鍏崇郴");
+                }
+
+                int containerLength = putContainer.ContainerLength;
+                int containerWidth = putContainer.ContainerWidth;
+                int maxValue = Math.Max(length, width);
+                int minValue = Math.Min(length, width);
+                if (minValue > putContainer.ContainerWidth)
+                {
+                    containerLength = maxValue;
+                    containerWidth = minValue;
+                }
+
+                orderContainer.MaxLength = containerLength;
+                orderContainer.MaxWidth = containerWidth;
+
+                if (containerItem == null)
+                {
+                    containerItem = new Dt_ContainerItem()
+                    {
+                        ContainerId = putContainer.Id,
+                        ItemCode = task.PalletCode,
+                        ItemLength = length,
+                        ItemWidth = width,
+                        ItemHeight = height,
+                        ItemPositionX = taskPosition.PositionX,
+                        ItemPositionY = taskPosition.PositionY,
+                        ItemPositionZ = taskPosition.PositionZ,
+                        ItemRelaPositionX = taskPosition.PutPositionX,
+                        ItemRelaPositionY = taskPosition.PutPositionY,
+                        ItemRelaPositionZ = taskPosition.PutPositionZ,
+                        ItemStatus = (int)ItemStatusEnum.Assigned,
+                        ItemName = task.PalletCode,
+                        Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}"
+                    };
+                    isAdd = true;
+                }
+                else
+                {
+                    containerItem.ItemLength = length;
+                    containerItem.ItemWidth = width;
+                    containerItem.ItemHeight = height;
+                    containerItem.ItemPositionX = taskPosition.PositionX;
+                    containerItem.ItemPositionY = taskPosition.PositionY;
+                    containerItem.ItemPositionZ = taskPosition.PositionZ;
+                    containerItem.ItemRelaPositionX = taskPosition.PutPositionX;
+                    containerItem.ItemRelaPositionY = taskPosition.PutPositionY;
+                    containerItem.ItemRelaPositionZ = taskPosition.PutPositionZ;
+                    containerItem.ItemStatus = (int)ItemStatusEnum.Assigned;
+                    containerItem.Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}";
+                }
+
+                task.TaskState = (int)TaskStatusEnum.Gantry_New;
+                task.CurrentAddress = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}";
+                task.NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}";
+                task.ItemInfo = $"{length}*{width}*{height}";
+
+                _unitOfWorkManage.BeginTran();
+                BaseDal.UpdateData(task);
+                _containerRepository.UpdateData(putContainer);
+                _orderContainerRepository.UpdateData(orderContainer);
+
+                if (isAdd)
+                {
+                    _containerItemRepository.AddData(containerItem);
+                }
+                else
+                {
+                    _containerItemRepository.UpdateData(containerItem);
+                }
+                _unitOfWorkManage.CommitTran();
+
+                return (true, task, "");
+
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return (false, null, $"閿欒,{ex.ExceptionToString()}");
+            }
+        }
+
+        /// <summary>
+        /// 鐢熸垚寮傚父浠诲姟
+        /// </summary>
+        /// <param name="orderInfo">璁㈠崟淇℃伅</param>
+        /// <returns>鍏冪粍鍖呭惈涓変釜鍊硷細 <br/>
+        /// Item1 - 鎿嶄綔鏄惁鎴愬姛锛坆ool锛� <br/>
+        /// Item2 - 鐢熸垚鐨勪换鍔″璞★紙Dt_Task锛夛紝澶辫触鏃朵负null <br/>
+        /// Item3 - 閿欒娑堟伅锛坰tring锛夛紝鎴愬姛鏃朵负绌哄瓧绗︿覆</returns>
+        /// <remarks>
+        /// 璇ユ柟娉曚細鏍规嵁璁㈠崟淇℃伅鐢熸垚涓�涓紓甯稿鐞嗕换鍔★紝鍖呮嫭锛� <br/>
+        /// 1. 鑾峰彇寮傚父浣嶇疆 <br/>
+        /// 2. 楠岃瘉鏀捐揣/鍙栬揣浣嶇疆 <br/>
+        /// 3. 鍒涘缓瀹瑰櫒椤瑰拰浠诲姟璁板綍 <br/>
+        /// 4. 鎻愪氦浜嬪姟
+        /// </remarks>
+        public (bool, Dt_Task?, string) GenerateExceptionTask(OrderInfo orderInfo)
+        {
+            int length = Convert.ToInt32(orderInfo.Length);
+            int width = Convert.ToInt32(orderInfo.Width);
+            int height = Convert.ToInt32(orderInfo.Thickness);
+
+            var (flag, taskPosition, message) = _containerService.GetExceptionPosition(length, width, height);
+            if (flag && taskPosition != null)
+            {
+                Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == taskPosition.PutPosition);
+                if (putContainer == null)
+                {
+                    return (false, null, "鏈壘鍒版斁璐т綅缃�");
+                }
+
+                Dt_Container? takeContainer = GetTakePosition(putContainer.DeviceCode);
+                if (takeContainer == null)
+                {
+                    return (false, null, "鏈壘鍒板彇璐т綅缃�");
+                }
+
+                Dt_ContainerItem dt_ContainerItem = new Dt_ContainerItem()
+                {
+                    ContainerId = putContainer.Id,
+                    ItemCode = orderInfo.Barcode,
+                    ItemLength = length,
+                    ItemWidth = width,
+                    ItemHeight = height,
+                    ItemPositionX = taskPosition.PositionX,
+                    ItemPositionY = taskPosition.PositionY,
+                    ItemPositionZ = taskPosition.PositionZ,
+                    ItemRelaPositionX = taskPosition.PutPositionX,
+                    ItemRelaPositionY = taskPosition.PutPositionY,
+                    ItemRelaPositionZ = taskPosition.PutPositionZ,
+                    ItemStatus = (int)ItemStatusEnum.Assigned,
+                    ItemName = orderInfo.Barcode,
+                    Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}"
+                };
+
+                Dt_Task dt_Task = new Dt_Task()
+                {
+                    PalletCode = orderInfo.Barcode,
+                    DeviceCode = putContainer.DeviceCode,
+                    TaskState = (int)TaskStatusEnum.Gantry_Wait,
+                    TaskType = 0,
+                    SourceAddress = "",
+                    TargetAddress = $"{takeContainer.ContainerNo}",
+                    CurrentAddress = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}",
+                    NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}",
+                    ItemInfo = $"{length}*{width}*{height}",
+                    Grade = 0,
+                };
+
+                if (taskPosition.TakeCenterPositionZ == 99)
+                {
+                    dt_Task.TaskState = (int)TaskStatusEnum.Gantry_BeRelease;
+                }
+
+                _unitOfWorkManage.BeginTran();
+                BaseDal.AddData(dt_Task);
+                _containerItemRepository.AddData(dt_ContainerItem);
+                _unitOfWorkManage.CommitTran();
+
+                return (true, dt_Task, "");
+            }
+            else
+            {
+                return (false, null, message);
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁璁惧缂栧彿鑾峰彇鍙栬揣浣嶇疆
+        /// </summary>
+        /// <param name="deviceCode">璁惧缂栧彿</param>
+        /// <returns>绗﹀悎鏉′欢鐨勫鍣ㄥ璞★紝鑻ユ壘涓嶅埌鍒欒繑鍥瀗ull</returns>
+        /// <remarks>
+        /// 1. 棣栧厛鏌ヨ鎸囧畾璁惧涓嬫墍鏈夊彲鐢ㄧ殑鍙栬揣瀹瑰櫒锛屽苟鎸塁ontainerSort鍗囧簭鎺掑簭 <br/>
+        /// 2. 鏌ユ壘璇ヨ澶囨渶杩戠殑浠诲姟璁板綍 <br/>
+        /// 3. 濡傛灉鎵惧埌浠诲姟璁板綍锛屽垯鏍规嵁浠诲姟婧愬湴鍧�鍖归厤瀹瑰櫒锛岃繑鍥炰笅涓�涓鍣�(鑻ュ凡鏄渶鍚庝竴涓垯杩斿洖绗竴涓�) <br/>
+        /// 4. 濡傛灉鍑虹幇寮傚父鎴栨湭鎵惧埌鍖归厤椤癸紝鍒欒繑鍥炵涓�涓彲鐢ㄥ鍣�
+        /// </remarks>
         public Dt_Container? GetTakePosition(string deviceCode)
         {
             Dictionary<string, OrderByType> orderby = new Dictionary<string, OrderByType>() { { nameof(Dt_Container.ContainerSort), OrderByType.Asc } };
@@ -449,6 +825,19 @@
             return containers.FirstOrDefault();
         }
 
+        /// <summary>
+        /// 浠诲姟瀹屾垚澶勭悊鏂规硶
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋</param>
+        /// <returns>Web鍝嶅簲鍐呭</returns>
+        /// <remarks>
+        /// 1. 鏇存柊浠诲姟鐘舵�佷负"榫欓棬鏋跺畬鎴�" <br/>
+        /// 2. 鏇存柊鐩稿叧璁㈠崟璇︽儏鐘舵�佷负"鐮佸灈鎴愬姛" <br/>
+        /// 3. 鏇存柊璁㈠崟琛屼腑鐨勬墭鐩樻暟閲� <br/>
+        /// 4. 鏍规嵁浠诲姟瀹屾垚鎯呭喌鍙戦�乄ebSocket閫氱煡 <br/>
+        /// 5. 璁板綍鎿嶄綔鏃ュ織骞舵彁浜や簨鍔� <br/>
+        /// 6. 寮傚父鏃跺洖婊氫簨鍔″苟杩斿洖閿欒淇℃伅
+        /// </remarks>
         public WebResponseContent TaskComplete(Dt_Task task)
         {
             try
@@ -470,6 +859,18 @@
                         _orderDetailsRepository.UpdateData(orderDetails);
                         _orderrowsRepository.UpdateData(orderrows);
 
+                        if (container.ContainerType == ContainerTypeEnum.ExceptionContainer.ObjToInt())
+                        {
+                            int count = Db.Queryable<Dt_ContainerItem>().Count(x => x.ContainerId == container.Id);
+                            if (count >= 5)
+                            {
+                                if (LightStatusStorage.LightStatusDic.ContainsKey(container.ContainerCode))
+                                {
+                                    LightStatusStorage.LightStatusDic[container.ContainerCode] = LightStatusEnum.LightError;
+                                }
+                            }
+                        }
+
                         try
                         {
                             List<string> containerItemCodes = _containerItemRepository.QueryData(x => x.ContainerId == container.Id).Select(x => x.ItemCode).ToList();
@@ -478,63 +879,37 @@
                             List<OrderDetails> details = totalDetails.Where(x => x.Orderrowsid == orderrows.id && x.Orderdetails_status == PalletingStatusEnmu.PalletingSuccess.ObjToInt() && containerItemCodes.Contains(x.Orderdetails_outid)).ToList();
 
                             int sortedNum = totalDetails.Where(x => x.Orderrowsid == orderrows.id && x.Orderdetails_status == PalletingStatusEnmu.PalletingSuccess.ObjToInt()).Count();
-                            object data = new object();
-                            if (totalDetails.Count <= sortedNum)
+
+                            List<object> orderData = new List<object>();
+                            foreach (var item in details)
                             {
-                                data = new
+                                object obj = new
                                 {
-                                    stationCode = task.NextAddress.Split("*").FirstOrDefault(),
-                                    release = 1,
-                                    data = new
-                                    {
-                                        stationCode = task.NextAddress.Split("*").FirstOrDefault(),
-                                        orderTotalNum = totalDetails.Count,
-                                        sortedNum = sortedNum,
-                                        unsortedNum = totalDetails.Count - sortedNum,
-                                        stationSortedNum = details.Count,
-                                        orderId = orderrows.id,
-                                        orderData = new
-                                        {
-                                            orderCode = orderrows.Orderrows_orderid,
-                                            cusName = orderrows.Orderrows_customer,
-                                            orderName = orderrows.Orderrows_name,
-                                            batch = orderrows.Orderrows_batchid,
-                                            productName = "",
-                                        }
-                                    }
+                                    name = item.Orderdetails_name,
+                                    baseName = item.Orderdetails_productName,
+                                    size = $"{item.Orderdetails_length}*{item.Orderdetails_width}*{item.Orderdetails_thickness}",
+                                    process = "",
                                 };
+                                orderData.Add(obj);
                             }
-                            else
+                            object data = new
                             {
-                                data = new
-                                {
-                                    stationCode = task.NextAddress.Split("*").FirstOrDefault(),
-                                    release = 0,
-                                    data = new
-                                    {
-                                        stationCode = task.NextAddress.Split("*").FirstOrDefault(),
-                                        orderTotalNum = totalDetails.Count,
-                                        sortedNum = sortedNum,
-                                        unsortedNum = totalDetails.Count - sortedNum,
-                                        stationSortedNum = details.Count,
-                                        orderId = orderrows.id,
-                                        orderData = new
-                                        {
-                                            orderCode = orderrows.Orderrows_orderid,
-                                            cusName = orderrows.Orderrows_customer,
-                                            orderName = orderrows.Orderrows_name,
-                                            batch = orderrows.Orderrows_batchid,
-                                            productName = "",
-                                        }
-                                    }
-                                };
-                            }
-                            List<WebSocketSession> webSocketSessions2 = _webSocketServer.OnlineSessions.ToList();
-                            List<WebSocketSession> webSocketSessions = _webSocketServer.OnlineSessions.Where(x => x.Url.Contains(task.DeviceCode ?? "")).ToList();
-                            foreach (var item in webSocketSessions)
-                            {
-                                _webSocketServer.SendClientPayload(item, data.Serialize());
-                            }
+                                orderCode = orderrows.Orderrows_orderid,
+                                orderName = orderrows.Orderrows_name,
+                                cusName = orderrows.Orderrows_customer,
+                                stationCode = container.ContainerCode,
+                                orderTotalNum = totalDetails.Count,
+                                sortedNum = sortedNum,
+                                unsortedNum = totalDetails.Count - sortedNum,
+                                stationSortedNum = details.Count,
+                                orderData = orderData,
+                                orderId = orderrows.id,
+                                release = 0
+                            };
+
+
+                            _webSocketServer.PublishAllClientPayload(data.Serialize());
+
                         }
                         catch (Exception ex)
                         {

--
Gitblit v1.9.3