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 | 1596 ++++++++++++++++++++++++++++++----------------------------
 1 files changed, 831 insertions(+), 765 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 5ce308e..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,852 +15,918 @@
  *----------------------------------------------------------------*/
 #endregion << 鐗� 鏈� 娉� 閲� >>
 
-using AutoMapper;
-using Magicodes.ExporterAndImporter.Core;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using NetTaste;
-using Newtonsoft.Json;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
-using SqlSugar;
-using System;
 using System.Collections.Generic;
-using System.ComponentModel;
-using System.Diagnostics;
-using System.Diagnostics.CodeAnalysis;
-using System.Linq;
-using System.Linq.Expressions;
-using System.Reflection;
-using System.Reflection.Metadata;
-using System.Security.Policy;
 using System.Text;
 using System.Threading.Tasks;
-using System.Xml.Linq;
-using WIDESEA_Comm.Http;
-using WIDESEA_Common.Log;
-using WIDESEAWCS_Common.TaskEnum;
+using AutoMapper;
+using HslCommunication;
+using HslCommunication.WebSocket;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
+using SqlSugar;
+using WIDESEAWCS_BasicInfoRepository;
+using WIDESEAWCS_BasicInfoService;
+using WIDESEAWCS_Common;
 using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
 using WIDESEAWCS_Core.Enums;
-using WIDESEAWCS_Core.Utilities;
-using WIDESEAWCS_DTO.Enum;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_DTO.BasicInfo;
+using WIDESEAWCS_DTO.PlacedBlockDTO;
 using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_IBasicInfoRepository;
+using WIDESEAWCS_IBasicInfoService;
 using WIDESEAWCS_ITaskInfoRepository;
 using WIDESEAWCS_ITaskInfoService;
 using WIDESEAWCS_Model.Models;
-using WIDESEAWCS_QuartzJob.Models;
-using WIDESEAWCS_QuartzJob.Service;
-using static Microsoft.IO.RecyclableMemoryStreamManager;
+using WIDESEAWCS_QuartzJob.Repository;
+using static Dm.net.buffer.ByteArrayBuffer;
 
 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
     {
-        private readonly IRouterService _routerService;
-        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
-        private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository;
-        private readonly ITask_HtyService _task_HtyService;
+        /// <summary>
+        /// 宸ヤ綔鍗曞厓绠$悊鎺ュ彛瀹炰緥锛岀敤浜庣鐞嗘暟鎹簱浜嬪姟鍜屽伐浣滃崟鍏�
+        /// </summary>
+        private readonly IUnitOfWorkManage _unitOfWorkManage;
+
+        /// <summary>
+        /// 鐢ㄤ簬瀵硅薄鏄犲皠鐨勬槧灏勫櫒瀹炰緥
+        /// </summary>
         private readonly IMapper _mapper;
 
+        /// <summary>
+        /// 瀹瑰櫒浠撳偍鎺ュ彛瀹炰緥锛岀敤浜庡鍣ㄧ浉鍏虫暟鎹搷浣�
+        /// </summary>
+        private readonly IContainerRepository _containerRepository;
 
-        private Dictionary<string, OrderByType> _taskOrderBy = new()
-            {
-                {nameof(Dt_Task.Grade),OrderByType.Desc },
-                {nameof(Dt_Task.CreateDate),OrderByType.Asc},
-            };
+        /// <summary>
+        /// 瀹瑰櫒鐗╁搧浠撳偍鎺ュ彛瀹炰緥锛堝彧璇伙級
+        /// </summary>
+        private readonly IContainerItemRepository _containerItemRepository;
 
-        public Dictionary<string, OrderByType> TaskOrderBy { get { return _taskOrderBy; } set { _taskOrderBy = value; } }
+        /// <summary>
+        /// WebSocket鏈嶅姟鍣ㄥ疄渚嬶紝鐢ㄤ簬澶勭悊WebSocket杩炴帴
+        /// </summary>
+        private readonly WebSocketServer _webSocketServer;
 
-        public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList();
+        /// <summary>
+        /// 璁㈠崟璇︽儏浠撳偍鎺ュ彛瀹炰緥锛堝彧璇伙級
+        /// </summary>
+        private readonly IOrderDetailsRepository _orderDetailsRepository;
 
-        public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList();
+        /// <summary>
+        /// 瀹瑰櫒鏈嶅姟鎺ュ彛瀹炰緥锛岀敤浜庣鐞嗕緷璧栨敞鍏ュ鍣ㄧ浉鍏虫搷浣�
+        /// </summary>
+        private readonly IContainerService _containerService;
 
-        public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService task_HtyService) : base(BaseDal)
+        /// <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)
         {
-            _routerService = routerService;
-            _taskExecuteDetailService = taskExecuteDetailService;
-            _taskExecuteDetailRepository = taskExecuteDetailRepository;
-            _task_HtyService = task_HtyService;
+            _unitOfWorkManage = unitOfWorkManage;
             _mapper = mapper;
+            _containerRepository = containerRepository;
+            _containerItemRepository = containerItemRepository;
+            _webSocketServer = webSocketServer;
+            _orderDetailsRepository = orderDetailsRepository;
+            _containerService = containerService;
+            _orderDetailsService = orderDetailsService;
+            _orderrowsRepository = orderrowsRepository;
+            _orderContainerRepository = orderContainerRepository;
         }
 
         /// <summary>
-        /// 鎺ユ敹WMS浠诲姟淇℃伅
+        /// 鏌ヨ鎸囧畾闂ㄦ灦璁惧鏈墽琛岀殑浠诲姟
         /// </summary>
-        /// <param name="taskDTOs">WMS浠诲姟瀵硅薄闆嗗悎</param>
-        /// <returns>杩斿洖澶勭悊缁撴灉</returns>
-        public WebResponseContent ReceiveWMSTask(Dt_Task taskDTOs)
+        /// <param name="gantryDeviceNo">闂ㄦ灦璁惧缂栧彿</param>
+        /// <returns>鏈墽琛岀殑浠诲姟鏁版嵁锛岃嫢涓嶅瓨鍦ㄥ垯杩斿洖null</returns>
+        public Dt_Task? QueryAGantryUnExecuteTask(string gantryDeviceNo)
         {
-            WebResponseContent content = new WebResponseContent();
+            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
             {
-                
-                BaseDal.AddData(taskDTOs);
-                content = WebResponseContent.Instance.OK("鎴愬姛");
-            }
-            catch (Exception ex)
-            {
-                content = WebResponseContent.Instance.Error($"鐢熸垚浠诲姟澶辫触,閿欒淇℃伅:{ex.Message}");
-            }
-            finally
-            {
-                WriteLog.GetLog("鐢熸垚浠诲姟").Write(JsonConvert.SerializeObject(content), "鐢熸垚浠诲姟");
-            }
-            return content;
-        }
-
-        /// <summary>
-        /// 鏌ユ壘璇ョ珯鍙版槸鍚︽湁浠诲姟
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns></returns>
-        public List<string> QueryConveyorLineTaskSourceAddress()
-        {
-            return BaseDal.QueryData().Select(task => task.SourceAddress).ToList();
-        }
-
-        /// <summary>
-        /// 淇敼浠诲姟锛屾坊鍔犵洰鏍囧湴鍧�
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns></returns>
-        public WebResponseContent UpdateTargetAddress(int TaskId,string TargetAddress)
-        {
-            
-            WebResponseContent content = new WebResponseContent();
-            try
-            {
-                Dt_Task dt_Task = BaseDal.QueryFirst(x => x.TaskId == TaskId);
-                dt_Task.TargetAddress = TargetAddress;
-                dt_Task.NextAddress = TargetAddress;
-                BaseDal.UpdateData(dt_Task);
-                content = WebResponseContent.Instance.OK("鎴愬姛");
-            }
-            catch (Exception ex)
-            {
-                content = WebResponseContent.Instance.Error($"浠诲姟鎺ユ敹閿欒,閿欒淇℃伅:{ex.Message}");
-            }
-            finally
-            {
-                WriteLog.GetLog("鎺ユ敹浠诲姟").Write(JsonConvert.SerializeObject(content), "鎺ユ敹浠诲姟");
-            }
-            return content;
-        }
-
-        /// <summary>
-        /// 鏌ユ壘鏄惁鏈変换鍔″彲浠ユ斁鍦ㄨ浣嶇疆
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns></returns>
-        public Dt_Task QueryConveyorLineTaskRoadway(int agvarea)
-        {
-            return BaseDal.QueryFirst(x => x.Roadway == agvarea.ToString() && x.MaterialType == (int)AgvStationEnum.BoardUnload && x.TargetAddress =="");
-
-        }
-
-
-        public bool QueryConveyorLinetaeersuadd(string taeersuadd)
-        {
-            Dt_Task dt_= BaseDal.QueryFirst(x => x.SourceAddress == taeersuadd || x.TargetAddress == taeersuadd);
-            if(dt_==null) return true;
-            else return false;
-
-        }
-        /// <summary>
-        /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鏌ヨ杈撻�佺嚎鏈墽琛岀殑浠诲姟
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns></returns>
-        public Dt_Task QueryConveyorLineTask(string deviceNo, string currentAddress)
-        {
-            return BaseDal.QueryFirst(x => (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.SC_OutFinish) && x.CurrentAddress == currentAddress, TaskOrderBy);
-        }
-
-        /// <summary>
-        /// 鏍规嵁浠诲姟鍙枫�佷笅涓�鍦板潃鏌ヨ杈撻�佺嚎鎵ц涓殑浠诲姟
-        /// </summary>
-        /// <param name="taskNum">浠诲姟鍙�</param>
-        /// <param name="nextAddress">涓嬩竴鍦板潃</param>
-        /// <returns></returns>
-        public Dt_Task QueryExecutingConveyorLineTask(int taskNum, string nextAddress)
-        {
-            return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.NextAddress == nextAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting), TaskOrderBy);
-        }
-
-        /// <summary>
-        /// 鏍规嵁浠诲姟鍙枫�佸綋鍓嶅湴鍧�鏌ヨ杈撻�佺嚎瀹屾垚鐨勪换鍔�
-        /// </summary>
-        /// <param name="taskNum">浠诲姟鍙�</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns></returns>
-        public Dt_Task QueryCompletedConveyorLineTask(int taskNum, string currentAddress)
-        {
-            return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InFinish || x.TaskState == (int)TaskOutStatusEnum.Line_OutFinish), TaskOrderBy);
-        }
-
-        /// <summary>
-        /// 鏍规嵁璁惧缂栧彿銆佷换鍔$被鍨嬪垎缁�(鍙��)鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鏂板鐨勪换鍔�
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="taskTypeGroup">浠诲姟绫诲瀷鍒嗙粍(鍙��)</param>
-        /// <returns></returns>
-        public Dt_Task? QuertStackerCraneTask(string deviceNo, TaskTypeGroup? taskTypeGroup = null)
-        {
-            if(taskTypeGroup == null)
-                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy);
-            if(taskTypeGroup.Value == TaskTypeGroup.InboundGroup)
-                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy);
-            if(taskTypeGroup.Value == TaskTypeGroup.OutbondGroup)
-                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy);
-            return null;
-        }
-
-        /// <summary>
-        /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鏂板鐨勪换鍔�
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns>
-        public Dt_Task QueryStackerCraneTask(string deviceNo, string currentAddress = "")
-        {
-            return BaseDal.QueryFirst(x => x.TaskState == (int)TaskOutStatusEnum.OutNew && (deviceNo == "AGV01" ? x.Roadway == AgvareaEnum.AreaOne.ToString() : x.Roadway != AgvareaEnum.AreaOne.ToString()),TaskOrderBy);
-        }
-
-
-        public Dt_Task IngStackerCraneTask(string deviceNo)
-        {
-            //string deviceNot = deviceNo == "SC01" ? "1" : "2";
-            return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.TaskState == (int)TaskInStatusEnum.SC_InExecuting);
-        }
-
-        public Dt_Task IngStackerCraneTask2(string deviceNo)
-        {
-            //string deviceNot = deviceNo == "SC01" ? "1" : "2";
-            try
-            {
-                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting);
-            }
-            catch (Exception ex)
-            {
-
-                throw;
-            }
-        }
-
-        /// <summary>
-        /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍏ュ簱绫诲瀷鐨勬柊澧炵殑浠诲姟
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns>
-        public Dt_Task QueryStackerCraneInTask(string deviceNo, string currentAddress = "")
-        {
-            if (string.IsNullOrEmpty(currentAddress))
-                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy);
-            else
-                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish && x.CurrentAddress == currentAddress, TaskOrderBy);
-        }
-
-        /// <summary>
-        /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍑哄簱绫诲瀷鐨勬柊澧炵殑浠诲姟
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns>
-        public Dt_Task QueryStackerCraneOutTask(string deviceNo, string currentAddress = "")
-        {
-            if (string.IsNullOrEmpty(currentAddress))
-                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy);
-            else
-                return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy);
-        }
-
-        /// <summary>
-        /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍑哄簱绫诲瀷鐨勬柊澧炵殑浠诲姟
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄闆嗗悎锛屽彲鑳戒负null</returns>
-        public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes)
-        {
-            return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.CurrentAddress), TaskOrderBy);
-        }
-
-        /// <summary>
-        /// 鏍规嵁鍑哄簱璐т綅鏌ヨ鏄惁鏈夊綋鍓嶆祬璐т綅浠诲姟
-        /// </summary>
-        /// <param name="deviceNo">璁惧缂栧彿</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄闆嗗悎锛屽彲鑳戒负null</returns>
-        public List<Dt_Task> QueryStationIsOccupiedOutTasks(string deviceNo, string SourceAddress)
-        {
-            return BaseDal.QueryData(x => x.Roadway == deviceNo && SourceAddress.Contains(x.SourceAddress), TaskOrderBy);
-        }
-
-        /// <summary>
-        /// 鏇存柊浠诲姟寮傚父淇℃伅鏄剧ず
-        /// </summary>
-        /// <param name="taskNum">浠诲姟鍙�</param>
-        /// <param name="message">寮傚父淇℃伅</param>
-        public WebResponseContent UpdateTaskExceptionMessage(int taskNum, string message)
-        {
-            WebResponseContent content = new WebResponseContent();
-            try
-            {
-                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
-                if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
-                if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
+                List<OrderDetails> orderDetails = _orderDetailsRepository.QueryData(x => x.Orderrowsid == orderRowId);
+                if (orderDetails == null || orderDetails.Count == 0)
                 {
-                    task.TaskState = (int)TaskOutStatusEnum.OutPending;
+                    return WebResponseContent.Instance.Error("鏈壘鍒拌鍗曟槑缁嗕俊鎭�");
                 }
-                else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
+
+                List<PlacedBlock> placedBlocks = new List<PlacedBlock>();
+
+                string putPosition = "";
+
+                for (int i = 0; i < orderDetails.Count; i++)
                 {
-                    task.TaskState = (int)TaskInStatusEnum.InPending;
-                }
-                task.ExceptionMessage = message;
-                task.ModifyDate = DateTime.Now;
-                BaseDal.UpdateData(task);
-
-                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, task.ExceptionMessage);
-
-                content = WebResponseContent.Instance.OK();
-            }
-            catch (Exception ex)
-            {
-                content = WebResponseContent.Instance.Error(ex.Message);
-            }
-            return content;
-        }
-
-        /// <summary>
-        /// 鏇存柊浠诲姟鐘舵�佷俊鎭紝骞跺悓姝ヨ嚦WMS
-        /// </summary>
-        /// <param name="taskNum">浠诲姟鍙�</param>
-        /// <param name="status">浠诲姟鐘舵��</param>
-        public void UpdateTaskStatus(int taskNum, int status)
-        {
-            Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
-            if (task == null) return;
-            task.TaskState = status;
-            task.ModifyDate = DateTime.Now;
-            BaseDal.UpdateData(task);
-        }
-
-        /// <summary>
-        /// 灏嗕换鍔$姸鎬佷慨鏀逛负涓嬩竴涓姸鎬�
-        /// </summary>
-        /// <param name="taskNum">浠诲姟鍙�</param>
-        public WebResponseContent UpdateTaskStatusToNext(int taskNum)
-        {
-            WebResponseContent content = new WebResponseContent();
-            try
-            {
-                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
-                if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
-                return UpdateTaskStatusToNext(task);
-            }
-            catch (Exception ex)
-            {
-                content = WebResponseContent.Instance.Error(ex.Message);
-            }
-            return content;
-        }
-
-        /// <summary>
-        /// 灏嗕换鍔$姸鎬佷慨鏀逛负涓嬩竴涓姸鎬�
-        /// </summary>
-        /// <param name="task">浠诲姟瀹炰綋瀵硅薄</param>
-        /// <returns></returns>
-        public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task)
-        {
-            WebResponseContent content = new WebResponseContent();
-            try
-            {
-                int oldState = task.TaskState;
-                if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
-                {
-                    if (task.TaskState >= (int)TaskOutStatusEnum.OutFinish)
+                    try
                     {
-                        return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
-                    }
-
-                    int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>();
-
-                    task.TaskState = nextStatus;
-                    if (task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting)
-                    {
-                        task.Dispatchertime = DateTime.Now;
-                    }
-                }
-                else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)
-                {
-                    if (task.TaskState >= (int)TaskInStatusEnum.InFinish)
-                    {
-                        return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
-                    }
-
-                    int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
-                    task.TaskState = nextStatus;
-                    if (task.TaskState == (int)TaskInStatusEnum.SC_InExecuting)
-                    {
-                        task.Dispatchertime = DateTime.Now;
-                    }
-                    if (task.TaskState == (int)TaskRelocationTypeEnum.Relocation)
-                    {
-                        Random random = new Random();
-                        task.CurrentAddress = task.NextAddress;
-                        task.NextAddress = $"{random.Next(1, 100).ToString().PadLeft(3, '0')}-{random.Next(1, 100).ToString().PadLeft(3, '0')}-{random.Next(1, 100).ToString().PadLeft(3, '0')}";
-                        task.TargetAddress = task.NextAddress;
-                    }
-                }
-                else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)
-                {
-                    if (task.TaskState <= (int)TaskRelocationStatusEnum.SC_RelocationFinish)
-                    {
-                        
-                        return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
-                    }
-
-                    int nextStatus = (int)TaskRelocationStatusEnum.SC_RelocationExecuting;
-                    task.TaskState = nextStatus;
-                    if (task.TaskState == (int)TaskRelocationStatusEnum.SC_RelocationExecuting)
-                    {
-                        task.Dispatchertime = DateTime.Now;
-                    }
-                }
-                else
-                {
-                    throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�");
-                }
-
-                if (task.TaskState <= 0)
-                {
-                    return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
-                }
-
-                
-                task.ModifyDate = DateTime.Now;
-                task.Modifier = "System";
-                BaseDal.UpdateData(task);
-
-                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ? $"浜哄伐鎵嬪姩灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戣烦杞埌銆恵task.TaskState}銆�" : $"绯荤粺鑷姩娴佺▼锛屼换鍔$姸鎬佷粠銆恵oldState}銆戣浆鍒般�恵task.TaskState}銆�");
-
-                content = WebResponseContent.Instance.OK();
-            }
-            catch (Exception ex)
-            {
-                content = WebResponseContent.Instance.Error(ex.Message);
-            }
-            return content;
-        }
-
-        /// <summary>
-        /// 鏍规嵁浠诲姟鍙枫�佸綋鍓嶅湴鍧�鏇存柊浠诲姟浣嶇疆淇℃伅
-        /// </summary>
-        /// <param name="taskNum">浠诲姟鍙�</param>
-        /// <param name="currentAddress">褰撳墠鍦板潃</param>
-        /// <returns></returns>
-        public Dt_Task? UpdatePosition(int taskNum, string currentAddress)
-        {
-            try
-            {
-                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress);
-                if (task == null) throw new Exception($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
-
-                string oldCurrentPos = task.CurrentAddress;
-                string oldNextPos = task.NextAddress;
-
-                List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress);
-                if (!routers.Any()) throw new Exception($"鏈壘鍒拌澶囪矾鐢变俊鎭�");
-
-                task.CurrentAddress = task.NextAddress;
-                task.NextAddress = routers.FirstOrDefault().ChildPosi;
-
-                task.ModifyDate = DateTime.Now;
-                task.Modifier = "System";
-                BaseDal.UpdateData(task);
-
-                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"绯荤粺鑷姩娴佺▼锛屾洿鏂板綋鍓嶄綅缃�恵oldCurrentPos} ----> {task.CurrentAddress}銆戝拰涓嬩竴浣嶇疆銆恵oldNextPos} ----> {task.NextAddress}銆�");
-                return task;
-            }
-            catch (Exception ex)
-            {
-            }
-            return null;
-        }
-
-        
-        public WebResponseContent StackCraneTaskCompleted(int taskNum)
-        {
-            WebResponseContent content = new WebResponseContent();
-            try
-            {
-                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
-                if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
-
-                if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound && task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting)
-                {
-                    /*List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress);
-                    if (!routers.Any()) return WebResponseContent.Instance.Error($"鏈壘鍒拌澶囪矾鐢变俊鎭�");*/
-
-                    task.TaskState = (int)TaskOutStatusEnum.OutFinish;
-                    task.ModifyDate = DateTime.Now;
-                    BaseDal.DeleteData(task);
-                    _task_HtyService.AddTaskHty(task);
-                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍑哄簱瀹屾垚");
-                    //todo 鍚屾鍒癢MS
-
-                    //鏆備笉鑰冭檻澶氫釜鍑哄簱鍙�
-                }
-                else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound && task.TaskState == (int)TaskInStatusEnum.SC_InExecuting)
-                {
-                    //todo 
-                    //int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>();
-                    task.TaskState = (int)TaskInStatusEnum.InFinish;
-                    task.ModifyDate = DateTime.Now;
-                    task.Modifier = "System";
-                    BaseDal.DeleteData(task);
-                    _task_HtyService.AddTaskHty(task);
-                    _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍏ュ簱瀹屾垚");
-
-                }
-                else
-                {
-                    throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�");
-                }
-                content = WebResponseContent.Instance.OK();
-            }
-            catch (Exception ex)
-            {
-                content = WebResponseContent.Instance.Error($"浠诲姟瀹屾垚寮傚父,浠诲姟鍙�:銆恵taskNum}銆�");
-            }
-            return content;
-        }
-
-        /// <summary>
-        /// 鎭㈠鎸傝捣浠诲姟
-        /// </summary>
-        /// <param name="taskNum">浠诲姟鍙�</param>
-        /// <returns>杩斿洖澶勭悊缁撴灉</returns>
-        public WebResponseContent TaskStatusRecovery(int taskNum)
-        {
-            WebResponseContent content = new WebResponseContent();
-            try
-            {
-                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
-                if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
-                if (task.TaskState != (int)TaskInStatusEnum.InPending && task.TaskState != (int)TaskOutStatusEnum.OutPending)
-                {
-                    return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙仮澶�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
-                }
-
-                Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.IsNormal, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } });
-                if (taskExecuteDetail != null)
-                {
-                    task.TaskState = taskExecuteDetail.TaskState;
-                }
-                else
-                {
-                    if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
-                    {
-                        task.TaskState = (int)TaskOutStatusEnum.OutNew;
-                    }
-                    else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
-                    {
-                        task.TaskState = (int)TaskInStatusEnum.InNew;
-                    }
-                    //todo
-                }
-
-                task.ExceptionMessage = string.Empty;
-
-                BaseDal.UpdateData(task);
-
-                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐鎭㈠鎸傝捣浠诲姟,鎭㈠鎸傝捣鏃朵换鍔$姸鎬併�恵task.TaskState}銆�");
-
-                content = WebResponseContent.Instance.OK();
-            }
-            catch (Exception ex)
-            {
-                content = WebResponseContent.Instance.Error(ex.Message);
-            }
-            return content;
-        }
-
-        /// <summary>
-        /// 鍥炴粴浠诲姟鐘舵��
-        /// </summary>
-        /// <param name="taskNum">浠诲姟鍙�</param>
-        /// <returns>杩斿洖澶勭悊缁撴灉</returns>
-        public WebResponseContent RollbackTaskStatusToLast(int taskNum)
-        {
-            WebResponseContent content = new();
-            try
-            {
-                Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
-                if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�");
-
-                int oldState = task.TaskState;
-                Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState < task.TaskState && x.TaskState > 0, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } });
-                if (taskExecuteDetail != null)
-                {
-                    task.TaskState = taskExecuteDetail.TaskState;
-                    task.CurrentAddress = taskExecuteDetail.CurrentAddress;
-                    task.NextAddress = taskExecuteDetail.NextAddress;
-                }
-                else
-                {
-                    return content = WebResponseContent.Instance.Error($"鏈壘鍒颁换鍔℃槑缁嗕俊鎭�,璇ヤ换鍔$姸鎬佷笉鍙洖婊氬埌涓婁竴姝�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�");
-                }
-
-                task.ExceptionMessage = string.Empty;
-
-                BaseDal.UpdateData(task);
-
-                _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戝洖婊氬埌銆恵task.TaskState}銆�");
-
-                content = WebResponseContent.Instance.OK();
-            }
-            catch (Exception ex)
-            {
-                content = WebResponseContent.Instance.Error(ex.Message);
-            }
-            return content;
-        }
-
-
-        /// <summary>
-        /// 鍒犻櫎鏁版嵁
-        /// </summary>
-        /// <param name="keys">涓婚敭鏁扮粍</param>
-        /// <returns></returns>
-        public virtual WebResponseContent DeleteData(object[] keys)
-        {
-            try
-            {
-                List<Dt_Task> tasks = BaseDal.QureyDataByIds(keys);
-                foreach (Dt_Task task in tasks)
-                {
-                    _task_HtyService.AddTaskHty(task);
-                }
-
-
-                if (typeof(Dt_Task).GetNavigatePro() == null)
-                    return BaseDal.DeleteDataByIds(keys) ? WebResponseContent.Instance.OK() : WebResponseContent.Instance.Error();
-                else
-                {
-                    if (keys != null)
-                    {
-                        Type detailType = typeof(Dt_Task).GetDetailType();
-                        string name = typeof(Dt_Task).GetMainIdByDetail();
-                        List<object> dynamicDelKeys = new List<object>();
-
-                        for (int i = 0; i < keys.Length; i++)
+                        lock (placedBlocks)
                         {
-                            dynamicDelKeys.Add(keys[i]);
+                            int length = Convert.ToInt32(orderDetails[i].Orderdetails_length);
+                            int width = Convert.ToInt32(orderDetails[i].Orderdetails_width);
+                            int height = Convert.ToInt32(orderDetails[i].Orderdetails_thickness);
+
+                            OrderInfo orderInfo = _orderDetailsService.GetOrderInfoByBarcode(orderDetails[i].Orderdetails_outid);
+
+                            var (flag, taskPosition, message) = _containerService.GetPosition(orderInfo.OrderHeadId, orderInfo.OrderNo, length, width, height);
+                            if (flag && taskPosition != null)
+                            {
+                                if (string.IsNullOrEmpty(putPosition))
+                                {
+                                    putPosition = taskPosition.PutPosition;
+                                }
+
+                                if (putPosition != taskPosition.PutPosition)
+                                {
+                                    continue;
+                                }
+
+                                Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.OrderNo == orderInfo.OrderNo && x.ContainerCode == taskPosition.PutPosition);
+
+                                Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == taskPosition.PutPosition);
+                                if (putContainer == null)
+                                {
+                                    //todo
+                                    throw new Exception("鏈壘鍒版斁璐т綅缃�");
+                                }
+
+                                bool isAdd = false;
+                                if (orderContainer == null)
+                                {
+                                    orderContainer = new Dt_OrderContainer()
+                                    {
+                                        OrderId = orderInfo.OrderHeadId,
+                                        ContainerCode = putContainer.ContainerCode,
+                                        ContainerId = putContainer.Id,
+                                        OrderNo = orderInfo.OrderNo,
+                                    };
+                                    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;
+                                }
+
+                                if (taskPosition != 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
+                                    };
+
+                                    Dt_Task dt_Task = new Dt_Task()
+                                    {
+                                        PalletCode = orderInfo.Barcode,
+                                        DeviceCode = putContainer.DeviceCode,
+                                        TaskState = (int)TaskStatusEnum.Gantry_Wait,
+                                        TaskType = 0,
+                                        SourceAddress = "",
+                                        TargetAddress = $"F06",
+                                        CurrentAddress = $"F06*{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,
+                                    };
+                                    putContainer.ContainerStatus = ContainerStatusEnum.NonEmpty.ObjToInt();
+                                    _unitOfWorkManage.BeginTran();
+                                    BaseDal.AddData(dt_Task);
+                                    _containerRepository.UpdateData(putContainer);
+                                    _containerItemRepository.AddData(dt_ContainerItem);
+                                    if (isAdd)
+                                    {
+                                        _orderContainerRepository.AddData(orderContainer);
+                                    }
+                                    _unitOfWorkManage.CommitTran();
+
+                                    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.PutPositionZ,
+                                        length = length > width ? length : width,
+                                        width = width > length ? length : width,
+                                        height,
+                                    };
+                                    _webSocketServer.PublishAllClientPayload(obj.Serialize());
+                                }
+                            }
                         }
-                        ((SqlSugarClient)BaseDal.Db).BeginTran();
-
-                        if (dynamicDelKeys.Count > 0)
-                            BaseDal.Db.Deleteable<object>().AS(detailType.Name).Where($"{name} in (@id)", new { id = dynamicDelKeys.ToArray() }).ExecuteCommandHasChange();
-
-                        BaseDal.DeleteDataByIds(keys);
-
-                        ((SqlSugarClient)BaseDal.Db).CommitTran();
-
-                        return WebResponseContent.Instance.OK();
                     }
-                    else
+                    catch (Exception ex)
                     {
-                        return WebResponseContent.Instance.Error("鍙傛暟閿欒");
+
                     }
                 }
+                return WebResponseContent.Instance.OK(data: placedBlocks);
             }
             catch (Exception ex)
             {
-                ((SqlSugarClient)BaseDal.Db).RollbackTran();
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
 
-        //agv浠诲姟
-        public WebResponseContent GetAgvTaskData()
+        /// <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)
         {
-            WebResponseContent content=new WebResponseContent();
-            List<Dt_Task> tasks = BaseDal.QueryData().ToList();
-            List<AGCTaskDto> agvdto = new List<AGCTaskDto>();
-            foreach (var item in tasks)
-            {
-                AGCTaskDto aGCTaskDto = new AGCTaskDto();
-                aGCTaskDto.TaskNum = item.TaskNum;
-                aGCTaskDto.SourceAddress= item.SourceAddress;
-                aGCTaskDto.TargetAddress= item.TargetAddress==null? "鏆傚畾" : item.TargetAddress;
-                aGCTaskDto.Dispatchertime = item.Dispatchertime;
-                aGCTaskDto.TaskState = item.TaskState == (int)TaskInStatusEnum.InNew ? "鏂板缓浠诲姟" : (item.TaskState == (int)TaskInStatusEnum.AGV_InExecuting ? "AGV浠诲姟鎵ц" : "浠诲姟瀹屾垚");
-                aGCTaskDto.TaskType = item.TaskType.ToString();
-                aGCTaskDto.Roadway = item.Roadway=="1"?"鍖哄煙涓�":(item.Roadway == "2" ? "鍖哄煙浜�": item.Roadway == "3" ? "鍖哄煙涓�":"鍖哄煙鍥�");
-                agvdto.Add(aGCTaskDto);
-            }
-            return content.OK(data: agvdto);
-        }
-
-        //agv鐘舵��
-        public WebResponseContent GetAgvStatusData()
-        {
-            var response = new WebResponseContent();
             try
             {
-                //agv绫诲瀷锛�0-娼滀紡鍨嬶紝1 - 鐗靛紩鍨嬶紝2 - 鎵胯浇鍨嬶紝3 - 涓惧崌鍨嬶紝4 -杈婇亾鍨嬶紝5 - 鍙夎溅鍨嬶紝6 - 鍏朵粬
-                int agvType = 0;
-                //agv缂栧彿
-                int agvCode = 2;
-                //agv涓婁笅绾跨姸鎬侊紝0-涓嬬嚎锛�1 - 涓婄嚎
-                int agvOnline = 4;
-                //agv褰撳墠鍦版爣鍙�
-                int agvRfidLabel = 6;
-                //agv褰撳墠x鍧愭爣鍊�
-                int agvXcoordinate = 8;
-                //agv褰撳墠y鍧愭爣鍊�
-                int agvYcoordinate = 12;
-                //agv杩愯鐘舵�� 锛�0-鍋滄锛�1 - 琛岄┒锛�2 - 鏆傚仠
-                int agvStatus = 16;
-                //agv褰撳墠杩愯閫熷害(mm / s)
-                int agvSpeed = 18;
-                //agv鎶ヨ浠g爜(鎸変綅鐘舵�佹彁鍙栵紝鏈�澶氬彲琛ㄧず32绉嶆姤璀�
-                int agvAlarmCode = 20;
-                bool isFirst = true;
-                List<AGVStatus> statusList = new List<AGVStatus>();
-                
-                for (int i = 0; i < 3; i++)
+                Dt_Container takeContainer = _containerRepository.QueryFirst(x => x.ContainerCode == takePosition && x.ContainerType == ContainerTypeEnum.TakeContainer.ObjToInt());
+                if (takeContainer == null)
                 {
-                    AGVStatus aGVStatus = new AGVStatus();
-                    aGVStatus.agvCode = i;
-                    aGVStatus.agvType = 1+i;
-                    aGVStatus.agvOnline = "123" + i;
-                    aGVStatus.agvRfidLabel = 2 + i;
-                    aGVStatus.agvXcoordinate = 3 + i;
-                    aGVStatus.agvYcoordinate = 4 + i;
-                    aGVStatus.agvStatus = 5 + i;
-                    aGVStatus.agvSpeed = 6 + i;
-                    aGVStatus.agvAlarmCode = i+99; //client.SiemensPLCClient.SiemensS7NetClient.Read("DB1001." + agvAlarmCode.ToString(), 32).Content;
-                    statusList.Add(aGVStatus);
-
+                    return WebResponseContent.Instance.Error("鍙栬揣浣嶇疆涓嶅瓨鍦�");
                 }
-                
-                response.OK(data: statusList);
+
+                List<Dt_Container> containers = _containerRepository.QueryData(x => x.DeviceCode == deviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt());
+
+                Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == putPosition && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt());
+                if (putContainer == null)
+                {
+                    return WebResponseContent.Instance.Error("鏀捐揣浣嶇疆涓嶅瓨鍦�");
+                }
+
+                int edge = 0;
+                if (putContainer.ContainerNo == containers.Min(x => x.ContainerNo))
+                {
+                    edge = 1;
+                }
+
+                ContainerSize containerSize = new ContainerSize(putContainer.ContainerLength, putContainer.ContainerWidth, putContainer.ContainerHeight);
+                List<Dt_ContainerItem> containerItems = _containerItemRepository.QueryData(x => x.ContainerId == putContainer.Id);
+
+                List<PlacedBlock> placedBlocks = containerItems.Select(x => new PlacedBlock(new Point3D(x.ItemPositionX, x.ItemPositionY, x.ItemPositionZ), x.ItemLength > x.ItemLength ? x.ItemLength : x.ItemWidth, x.ItemLength > x.ItemLength ? x.ItemWidth : x.ItemLength, x.ItemHeight)).ToList();
+
+
+                TaskPosition? taskPosition = _containerService.GetTaskPosition(length, width, height, containerSize, placedBlocks, edge);
+                if (taskPosition == null)
+                {
+                    return WebResponseContent.Instance.Error("鏈壘鍒板悎閫傛斁缃綅缃�");
+                }
+
+                object obj = new
+                {
+                    x = taskPosition.PutCenterPositionX - putContainer.ContainerLength / 2,
+                    y = taskPosition.PutCenterPositionY - putContainer.ContainerWidth / 2,
+                    z = taskPosition.PutCenterPositionZ,
+                    length,
+                    width,
+                    height,
+                };
+
+                _webSocketServer.PublishAllClientPayload(obj.Serialize());
+
+                string code = DateTime.Now.ToString("yyyyMMddHHmmss");
+
+                Dt_ContainerItem dt_ContainerItem = new Dt_ContainerItem()
+                {
+                    ContainerId = putContainer.Id,
+                    ItemCode = code,
+                    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 = code
+                };
+
+                Dt_Task dt_Task = new Dt_Task()
+                {
+                    PalletCode = code,
+                    DeviceCode = putContainer.DeviceCode,
+                    TaskState = (int)TaskStatusEnum.Gantry_New,
+                    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,
+                };
+
+                _containerItemRepository.AddData(dt_ContainerItem);
+                base.AddData(dt_Task);
+
+                return WebResponseContent.Instance.OK();
             }
             catch (Exception ex)
             {
-                response.Error(ex.Message);
+                return WebResponseContent.Instance.Error(ex.Message);
             }
-
-            return response;
         }
 
-        public WebResponseContent GetAgvStatusData2()
+        /// <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)
         {
-            var response = new WebResponseContent();
             try
             {
-                //agv绫诲瀷锛�0-娼滀紡鍨嬶紝1 - 鐗靛紩鍨嬶紝2 - 鎵胯浇鍨嬶紝3 - 涓惧崌鍨嬶紝4 -杈婇亾鍨嬶紝5 - 鍙夎溅鍨嬶紝6 - 鍏朵粬
-                int agvType = 0;
-                //agv缂栧彿
-                int agvCode = 2;
-                //agv涓婁笅绾跨姸鎬侊紝0-涓嬬嚎锛�1 - 涓婄嚎
-                int agvOnline = 4;
-                //agv褰撳墠鍦版爣鍙�
-                int agvRfidLabel = 6;
-                //agv褰撳墠x鍧愭爣鍊�
-                int agvXcoordinate = 8;
-                //agv褰撳墠y鍧愭爣鍊�
-                int agvYcoordinate = 12;
-                //agv杩愯鐘舵�� 锛�0-鍋滄锛�1 - 琛岄┒锛�2 - 鏆傚仠
-                int agvStatus = 16;
-                //agv褰撳墠杩愯閫熷害(mm / s)
-                int agvSpeed = 18;
-                //agv鎶ヨ浠g爜(鎸変綅鐘舵�佹彁鍙栵紝鏈�澶氬彲琛ㄧず32绉嶆姤璀�
-                int agvAlarmCode = 20;
-                bool isFirst = true;
-                List<AGVStatus> statusList = new List<AGVStatus>();
+                int length = Convert.ToInt32(orderInfo.Length);
+                int width = Convert.ToInt32(orderInfo.Width);
+                int height = Convert.ToInt32(orderInfo.Thickness);
 
-                for (int i = 0; i < 6; i++)
+                var (flag, taskPosition, message) = _containerService.GetPosition(orderInfo.OrderHeadId, orderInfo.OrderNo, length, width, height);
+                if (flag && taskPosition != null)
                 {
-                    AGVStatus aGVStatus = new AGVStatus();
-                    aGVStatus.agvCode = i;
-                    aGVStatus.agvType = 1 + i;
-                    aGVStatus.agvOnline = "123" + i;
-                    aGVStatus.agvRfidLabel = 2 + i;
-                    aGVStatus.agvXcoordinate = 3 + i;
-                    aGVStatus.agvYcoordinate = 4 + i;
-                    aGVStatus.agvStatus = 5 + i;
-                    aGVStatus.agvSpeed = 6 + i;
-                    aGVStatus.agvAlarmCode = i + 99; //client.SiemensPLCClient.SiemensS7NetClient.Read("DB1001." + agvAlarmCode.ToString(), 32).Content;
-                    statusList.Add(aGVStatus);
+                    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_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.OrderNo == orderInfo.OrderNo && x.ContainerCode == putContainer.ContainerCode);
+
+                    bool isAdd = false;
+                    bool isUpdate = false;
+                    if (orderContainer == null)
+                    {
+                        orderContainer = new Dt_OrderContainer()
+                        {
+                            OrderId = orderInfo.OrderHeadId,
+                            ContainerCode = putContainer.ContainerCode,
+                            ContainerId = putContainer.Id,
+                            OrderNo = orderInfo.OrderNo,
+                        };
+
+                        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;
+                    }
+
+                    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,
+                    };
+                    putContainer.ContainerStatus = ContainerStatusEnum.NonEmpty.ObjToInt();
+                    _unitOfWorkManage.BeginTran();
+                    BaseDal.AddData(dt_Task);
+                    _containerRepository.UpdateData(putContainer);
+                    _containerItemRepository.AddData(dt_ContainerItem);
+                    if (isAdd)
+                    {
+                        _orderContainerRepository.AddData(orderContainer);
+                    }
+                    else if (isUpdate)
+                    {
+                        _orderContainerRepository.UpdateData(orderContainer);
+                    }
+                    _unitOfWorkManage.CommitTran();
+
+                    return (true, dt_Task, "");
                 }
-
-                response.OK(data: statusList);
+                else
+                {
+                    return (false, null, message);
+                }
             }
             catch (Exception ex)
             {
-                response.Error(ex.Message);
+                _unitOfWorkManage.RollbackTran();
+                return (false, null, $"閿欒,{ex.ExceptionToString()}");
             }
-
-            return response;
         }
 
-
-        public class AGVStatus
+        /// <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)
         {
-            /// <summary>
-            /// agv绫诲瀷锛�0-娼滀紡鍨嬶紝1 - 鐗靛紩鍨嬶紝2 - 鎵胯浇鍨嬶紝3 - 涓惧崌鍨嬶紝4 -杈婇亾鍨嬶紝5 - 鍙夎溅鍨嬶紝6 - 鍏朵粬
-            /// </summary>
-            public int agvType { get; set; }
+            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];
 
-            /// <summary>
-            /// agv缂栧彿
-            /// </summary>
-            public int agvCode { get; set; }
+                Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == containerCode);
 
-            /// <summary>
-            /// agv涓婁笅绾跨姸鎬侊紝0-涓嬬嚎锛�1 - 涓婄嚎
-            /// </summary>
-            public string agvOnline { get; set; }
+                if (putContainer == null)
+                {
+                    return (false, null, "鏈壘鍒版斁璐т綅缃�");
+                }
 
-            /// <summary>
-            /// agv褰撳墠鍦版爣鍙�
-            /// </summary>
-            public int agvRfidLabel { get; set; }
+                Dt_Container? takeContainer = _containerRepository.QueryFirst(x => x.ContainerCode == stationCode);
+                if (takeContainer == null)
+                {
+                    return (false, null, "鏈壘鍒板彇璐т綅缃�");
+                }
 
-            /// <summary>
-            /// agv褰撳墠x鍧愭爣鍊�
-            /// </summary>
-            public int agvXcoordinate { get; set; }
+                var (flag, taskPosition, message) = _containerService.GetPosition(putContainer, length, width, height);
+                if (!flag || taskPosition == null)
+                {
+                    return (false, null, message);
+                }
 
-            /// <summary>
-            /// agv褰撳墠y鍧愭爣鍊�
-            /// </summary>
-            public int agvYcoordinate { get; set; }
+                Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.ContainerCode == putContainer.ContainerCode);
 
-            /// <summary>
-            /// agv杩愯鐘舵�� 锛�0-鍋滄锛�1 - 琛岄┒锛�2 - 鏆傚仠
-            /// </summary>
-            public int agvStatus { get; set; }
+                bool isAdd = false;
 
-            /// <summary>
-            /// agv褰撳墠杩愯閫熷害(mm / s)
-            /// </summary>
-            public int agvSpeed { get; set; }
+                if (orderContainer == null)
+                {
+                    return (false, null, "鏈壘鍒拌鍗曚笌瀹瑰櫒缁戝畾鍏崇郴");
+                }
 
-            /// <summary>
-            /// agv鎶ヨ浠g爜(鎸変綅鐘舵�佹彁鍙栵紝鏈�澶氬彲琛ㄧず32绉嶆姤璀�
-            /// </summary>
-            public int agvAlarmCode { get; set; }
+                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 } };
+            List<Dt_Container> containers = _containerRepository.QueryData(x => x.ContainerType == ContainerTypeEnum.TakeContainer.ObjToInt() && x.DeviceCode == deviceCode && x.ContainerEnable, orderby);
+
+            try
+            {
+                if (containers == null || containers.Count == 0)
+                {
+                    throw new Exception($"鏈壘鍒板搴旂殑鍙栬揣浣嶇疆,璁惧缂栧彿:{deviceCode}");
+                }
+
+                Dictionary<string, OrderByType> taskOrderby = new Dictionary<string, OrderByType>() { { nameof(Dt_Task.TaskNum), OrderByType.Desc } };
+                Dt_Task task = BaseDal.QueryFirst(x => x.DeviceCode == deviceCode, taskOrderby);
+                if (task != null)
+                {
+                    string? sourceCode = task.SourceAddress.Split("*").FirstOrDefault();
+                    if (!string.IsNullOrEmpty(sourceCode))
+                    {
+                        Dt_Container? container = containers.FirstOrDefault(x => x.ContainerCode == sourceCode);
+                        if (container != null)
+                        {
+                            int index = containers.IndexOf(container);
+
+                            if (index + 1 < containers.Count)
+                            {
+                                return containers[index + 1];
+                            }
+                            else
+                            {
+                                return containers.FirstOrDefault();
+                            }
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+
+            }
+            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
+            {
+                task.TaskState = TaskStatusEnum.Gantry_Completed.ObjToInt();
+                _unitOfWorkManage.BeginTran();
+                OrderDetails orderDetails = _orderDetailsRepository.QueryFirst(x => x.Orderdetails_outid == task.PalletCode);
+                if (orderDetails != null)
+                {
+                    orderDetails.Orderdetails_status = PalletingStatusEnmu.PalletingSuccess.ObjToInt();
+
+                    Orderrows orderrows = _orderrowsRepository.QueryFirst(x => x.id == orderDetails.Orderrowsid);
+                    if (orderrows != null)
+                    {
+                        orderrows.Orderrows_PalletNum = orderrows.Orderrows_PalletNum ?? 0 + 1;
+
+                        Dt_Container container = _containerRepository.QueryFirst(x => task.NextAddress.Contains(x.ContainerCode));
+
+                        _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();
+
+                            List<OrderDetails> totalDetails = _orderDetailsRepository.QueryData(x => x.Orderrowsid == orderrows.id);
+                            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();
+
+                            List<object> orderData = new List<object>();
+                            foreach (var item in details)
+                            {
+                                object obj = new
+                                {
+                                    name = item.Orderdetails_name,
+                                    baseName = item.Orderdetails_productName,
+                                    size = $"{item.Orderdetails_length}*{item.Orderdetails_width}*{item.Orderdetails_thickness}",
+                                    process = "",
+                                };
+                                orderData.Add(obj);
+                            }
+                            object data = new
+                            {
+                                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)
+                        {
+
+                        }
+                    }
+                }
+
+                BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId > 0 ? OperateTypeEnum.浜哄伐瀹屾垚 : OperateTypeEnum.鑷姩瀹屾垚);
+                _unitOfWorkManage.CommitTran();
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
         }
     }
 }

--
Gitblit v1.9.3