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_BasicInfoService/ContainerService.cs |  511 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 467 insertions(+), 44 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ContainerService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ContainerService.cs"
index 43520f5..80e52d4 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ContainerService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ContainerService.cs"
@@ -4,90 +4,513 @@
 using System.Text;
 using System.Threading.Tasks;
 using AutoMapper;
+using HslCommunication.WebSocket;
+using WIDESEAWCS_BasicInfoRepository;
 using WIDESEAWCS_BasicInfoService;
 using WIDESEAWCS_Common;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
 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_Model.Models;
 
-namespace WIDESEAWCS_IBasicInfoService
+namespace WIDESEAWCS_BasicInfoService
 {
+    /// <summary>
+    /// 瀹瑰櫒鏈嶅姟绫伙紝鎻愪緵瀹瑰櫒鐩稿叧鐨勪笟鍔¢�昏緫鎿嶄綔
+    /// </summary>
+    /// <remarks>
+    /// 涓昏鍔熻兘鍖呮嫭锛� <br/>
+    /// 1. 鑾峰彇鐗╁搧鍦ㄥ鍣ㄤ腑鐨勬斁缃綅缃� <br/>
+    /// 2. 澶勭悊寮傚父宸ヤ綅鐨勪綅缃垎閰� <br/>
+    /// 3. 鏍规嵁璁㈠崟鎴栧昂瀵歌幏鍙栧悎閫傜殑浣嶇疆 <br/>
+    /// 4. 閲婃斁瀹瑰櫒璧勬簮 <br/>
+    /// 浣跨敤渚濊禆娉ㄥ叆鏂瑰紡鑾峰彇浠撳偍鎺ュ彛鍜屽伐浣滃崟鍏冪鐞�
+    /// </remarks>
     public class ContainerService : ServiceBase<Dt_Container, IContainerRepository>, IContainerService
     {
+        /// <summary>
+        /// 鐢ㄤ簬瀵硅薄鏄犲皠鐨勬槧灏勫櫒瀹炰緥
+        /// </summary>
         private readonly IMapper _mapper;
+        /// <summary>
+        /// 宸ヤ綔鍗曞厓绠$悊鎺ュ彛瀹炰緥锛岀敤浜庣鐞嗘暟鎹簱浜嬪姟鍜屽伐浣滃崟鍏�
+        /// </summary>
+        private readonly IUnitOfWorkManage _unitOfWorkManage;
+        /// <summary>
+        /// 瀹瑰櫒鐗╁搧浠撳偍鎺ュ彛瀹炰緥
+        /// </summary>
+        private readonly IContainerItemRepository _containerItemRepository;
+        /// <summary>
+        /// 璁㈠崟瀹瑰櫒浠撳偍鎺ュ彛瀹炰緥
+        /// </summary>
+        private readonly IOrderContainerRepository _orderContainerRepository;
+        /// <summary>
+        /// 浠诲姟浠撳偍鎺ュ彛瀹炰緥锛岀敤浜庢搷浣滀换鍔℃暟鎹�
+        /// </summary>
+        private readonly ITaskRepository _taskRepository;
+        /// <summary>
+        /// WebSocket鏈嶅姟鍣ㄥ疄渚嬶紝鐢ㄤ簬澶勭悊瀹炴椂閫氫俊
+        /// </summary>
+        private readonly WebSocketServer _webSocketServer;
 
-        public ContainerService(IContainerRepository BaseDal, IMapper mapper) : base(BaseDal)
+        /// <summary>
+        /// 瀹瑰櫒鏈嶅姟鏋勯�犲嚱鏁�
+        /// </summary>
+        /// <param name="BaseDal">瀹瑰櫒浠撳偍鎺ュ彛</param>
+        /// <param name="mapper">瀵硅薄鏄犲皠鍣�</param>
+        /// <param name="unitOfWorkManage">宸ヤ綔鍗曞厓绠$悊鍣�</param>
+        /// <param name="containerItemRepository">瀹瑰櫒椤逛粨鍌ㄦ帴鍙�</param>
+        /// <param name="orderContainerRepository">璁㈠崟瀹瑰櫒浠撳偍鎺ュ彛</param>
+        /// <param name="taskRepository">浠诲姟浠撳偍鎺ュ彛</param>
+        /// <param name="webSocketServer">WebSocket鏈嶅姟瀹炰緥</param>
+        public ContainerService(IContainerRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IContainerItemRepository containerItemRepository, IOrderContainerRepository orderContainerRepository, ITaskRepository taskRepository, WebSocketServer webSocketServer) : base(BaseDal)
         {
             _mapper = mapper;
+            _unitOfWorkManage = unitOfWorkManage;
+            _containerItemRepository = containerItemRepository;
+            _orderContainerRepository = orderContainerRepository;
+            _taskRepository = taskRepository;
+            _webSocketServer = webSocketServer;
         }
 
-        public void GetPosition(string orderNo, int length, int width, int height)
+        /// <summary>
+        /// 鑾峰彇浠诲姟浣嶇疆淇℃伅
+        /// </summary>
+        /// <param name="length">鐗╁搧闀垮害</param>
+        /// <param name="width">鐗╁搧瀹藉害</param>
+        /// <param name="height">鐗╁搧楂樺害</param>
+        /// <param name="containerSize">瀹瑰櫒灏哄</param>
+        /// <param name="placedBlocks">宸叉斁缃潡鍒楄〃</param>
+        /// <param name="edge">杈圭紭鍙傛暟</param>
+        /// <returns>杩斿洖浠诲姟浣嶇疆淇℃伅锛岃嫢鏀剧疆澶辫触鍒欒繑鍥瀗ull</returns>
+        /// <exception cref="Exception">褰撴斁缃繃绋嬩腑鍙戠敓閿欒鏃舵姏鍑哄紓甯�</exception>
+        public TaskPosition? GetTaskPosition(int length, int width, int height, ContainerSize containerSize, List<PlacedBlock> placedBlocks, int edge)
         {
-            List<Dt_OrderContainer> containerInfos = new List<Dt_OrderContainer>();
-            List<Dt_OrderContainer> orderContainers = Db.Queryable<Dt_OrderContainer>().Where(it => it.OrderNo == orderNo).ToList();
-            if (orderContainers != null)
+            try
             {
-                containerInfos = orderContainers;
-                if (containerInfos.Count == 1)
+                PlaceBlockService placeBlockService = new PlaceBlockService(containerSize, placedBlocks);
+
+                TaskPosition? taskPosition = placeBlockService.PlaceBlock(length, width, height, edge);
+                return taskPosition;
+            }
+            catch (Exception ex)
+            {
+                throw new Exception(ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇寮傚父宸ヤ綅浣嶇疆
+        /// </summary>
+        /// <param name="length">鐗╁搧闀垮害</param>
+        /// <param name="width">鐗╁搧瀹藉害</param>
+        /// <param name="height">鐗╁搧楂樺害</param>
+        /// <returns>鍏冪粍鍖呭惈涓変釜鍊硷細鏄惁鎴愬姛鑾峰彇銆佷换鍔′綅缃璞�(澶辫触鏃朵负null)銆侀敊璇俊鎭�(鎴愬姛鏃朵负绌�)</returns>
+        /// <remarks>
+        /// 褰撳紓甯稿鍣ㄤ腑鐗╁搧鏁伴噺鈮�5鏃讹紝浣跨敤鍥哄畾Z杞翠綅缃�99锛涘惁鍒欐牴鎹綋鍓嶇墿鍝佹暟閲忚绠椾綅缃�
+        /// </remarks>
+        public (bool, TaskPosition?, string) GetExceptionPosition(int length, int width, int height)
+        {
+            Dt_Container? container = Db.Queryable<Dt_Container>().Where(x => x.ContainerType == ContainerTypeEnum.ExceptionContainer.ObjToInt()).Includes(x => x.Items).First();
+            if (container == null)
+            {
+                return (false, null, "璇烽厤缃紓甯稿伐浣�");
+            }
+
+            if (container.Items.Count >= 5)
+            {
+                ContainerSize containerSize = new ContainerSize(container.ContainerLength, container.ContainerWidth, container.ContainerHeight);
+                ExceptionPlaceBlockService exceptionPlaceBlockService = new ExceptionPlaceBlockService(containerSize);
+                TaskPosition taskPosition = exceptionPlaceBlockService.ExceptionPlaceBlock(length, width, height, 0);
+                taskPosition.TakeCenterPositionZ = 99;
+                taskPosition.PutPosition = container.ContainerCode;
+                if (LightStatusStorage.LightStatusDic.ContainsKey(container.ContainerCode))
                 {
-                    Dt_Container container = Db.Queryable<Dt_Container>().First(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt());
-                    if (container != null)
-                    {
-                        Dt_OrderContainer containerInfo = _mapper.Map<Dt_OrderContainer>(container);
-                        containerInfos.Add(containerInfo);
-                    }
+                    LightStatusStorage.LightStatusDic[container.ContainerCode] = LightStatusEnum.LightError;
                 }
+                return (true, taskPosition, "");
             }
             else
             {
-                List<Dt_Container> containers = Db.Queryable<Dt_Container>().Where(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt()).Take(2).ToList();
-                if (containers != null && containers.Count > 0)
+                ContainerSize containerSize = new ContainerSize(container.ContainerLength, container.ContainerWidth, container.ContainerHeight);
+                ExceptionPlaceBlockService exceptionPlaceBlockService = new ExceptionPlaceBlockService(containerSize);
+                TaskPosition taskPosition = exceptionPlaceBlockService.ExceptionPlaceBlock(length, width, height, container.Items.Count);
+                taskPosition.PutPosition = container.ContainerCode;
+                return (true, taskPosition, "");
+            }
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁璁㈠崟淇℃伅鎴栧昂瀵歌幏鍙栦换鍔′綅缃�
+        /// </summary>
+        /// <param name="orderId">璁㈠崟ID</param>
+        /// <param name="orderNo">璁㈠崟缂栧彿</param>
+        /// <param name="length">闀垮害</param>
+        /// <param name="width">瀹藉害</param>
+        /// <param name="height">楂樺害</param>
+        /// <returns>
+        /// 杩斿洖鍏冪粍鍖呭惈涓変釜鍊硷細 <br/>
+        /// Item1 - 鏄惁鎴愬姛鑾峰彇浣嶇疆 <br/>
+        /// Item2 - 鑾峰彇鍒扮殑浠诲姟浣嶇疆瀵硅薄锛屽彲鑳戒负null <br/>
+        /// Item3 - 閿欒浠g爜锛屾垚鍔熸椂杩斿洖绌哄瓧绗︿覆
+        /// </returns>
+        public (bool, TaskPosition?, string) GetPosition(int orderId, string orderNo, int length, int width, int height)
+        {
+            TaskPosition? taskPosition = GetPositionByOrder(orderId, orderNo, length, width, height);
+            if (taskPosition != null)
+            {
+                return (true, taskPosition, "");
+            }
+            taskPosition = GetPosition(length, width, height);
+            if (taskPosition != null)
+            {
+                return (true, taskPosition, "");
+            }
+            return (false, null, "10001");
+        }
+
+        /// <summary>
+        /// 鏍规嵁鐗╁搧灏哄鑾峰彇鍚堥�傜殑瀹瑰櫒浣嶇疆
+        /// </summary>
+        /// <param name="length">鐗╁搧闀垮害</param>
+        /// <param name="width">鐗╁搧瀹藉害</param>
+        /// <param name="height">鐗╁搧楂樺害</param>
+        /// <returns>杩斿洖鎵惧埌鐨勪换鍔′綅缃俊鎭紝鍖呭惈瀹瑰櫒缂栫爜锛涜嫢鏈壘鍒板悎閫備綅缃垯杩斿洖null</returns>
+        /// <remarks>
+        /// 璇ユ柟娉曚細鏌ヨ鎵�鏈夊彲鐢ㄧ┖瀹瑰櫒锛屽苟鏍规嵁鐗╁搧灏哄鍜屽鍣ㄧ姸鎬佸垽鏂槸鍚﹂�傚悎鏀剧疆銆� <br/>
+        /// 瀵逛簬瓒呭ぇ鐗╁搧(闀挎垨瀹借秴杩�1600)鎴栨湁鐗规畩瑕佹眰鐨勫鍣ㄤ細杩涜鐗规畩澶勭悊銆�
+        /// </remarks>
+        public TaskPosition? GetPosition(int length, int width, int height)
+        {
+            List<Dt_Container> containers = Db.Queryable<Dt_Container>().Where(x => x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Includes(x => x.Items).ToList();
+
+            Dt_Container? container = containers.OrderBy(x => x.ContainerSort).FirstOrDefault(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt() && x.ContainerEnable);
+            List<PlacedBlock> placedBlocks = new List<PlacedBlock>();
+            if (container != null)
+            {
+                int edge = 0;
+                if (container.ContainerNo == containers.Where(x => x.DeviceCode == container.DeviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Min(x => x.ContainerNo))
                 {
-                    containerInfos = _mapper.Map<List<Dt_OrderContainer>>(containers);
+                    edge = 1;
+                }
+                int containerLength = container.ContainerLength;
+                int containerWidth = container.ContainerWidth;
+                int maxValue = Math.Max(length, width);
+                int minValue = Math.Min(length, width);
+                if (minValue > container.ContainerWidth)
+                {
+                    containerLength = maxValue;
+                    containerWidth = minValue;
+                }
+                ContainerSize containerSize = new ContainerSize(containerLength, containerWidth, container.ContainerHeight);
+                TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks, edge);
+                if (taskPosition != null)
+                {
+                    taskPosition.PutPosition = container.ContainerCode;
+                    return taskPosition;
                 }
             }
 
+            return null;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎸囧畾瀹瑰櫒涓殑鍙敤浣嶇疆
+        /// </summary>
+        /// <param name="container">鐩爣瀹瑰櫒瀵硅薄</param>
+        /// <param name="length">寰呮斁缃墿鍝侀暱搴�</param>
+        /// <param name="width">寰呮斁缃墿鍝佸搴�</param>
+        /// <param name="height">寰呮斁缃墿鍝侀珮搴�</param>
+        /// <returns>鍏冪粍鍖呭惈锛� <br/>
+        ///   - bool: 鏄惁鎵惧埌鍚堥�備綅缃� <br/>
+        ///   - TaskPosition?: 鎵惧埌鐨勪换鍔′綅缃俊鎭�(鍙负null) <br/>
+        ///   - string: 閿欒浠g爜(鎴愬姛鏃惰繑鍥炵┖瀛楃涓�)
+        /// </returns>
+        /// <remarks>
+        /// 鏂规硶浼氭鏌ュ鍣ㄥ昂瀵告槸鍚︽弧瓒崇墿鍝佹斁缃姹傦紝 <br/>
+        /// 骞惰�冭檻瀹瑰櫒杈圭紭鎯呭喌璁$畻鏈�浣虫斁缃綅缃�
+        /// </remarks>
+        public (bool, TaskPosition?, string) GetPosition(Dt_Container container, int length, int width, int height)
+        {
+            List<Dt_Container> containers = Db.Queryable<Dt_Container>().Where(x => x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Includes(x => x.Items).ToList();
+            List<PlacedBlock> placedBlocks = new List<PlacedBlock>();
+            if (container != null)
             {
-                List<Dt_Container> containers = Db.Queryable<Dt_Container>().Where(it => containerInfos.Any(x => x.ContainerId == it.Id && x.ContainerCode == it.ContainerCode)).Includes(x => x.Items).ToList();
+                int edge = 0;
+                if (container.ContainerNo == containers.Where(x => x.DeviceCode == container.DeviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Min(x => x.ContainerNo))
+                {
+                    edge = 1;
+                }
+                int containerLength = container.ContainerLength;
+                int containerWidth = container.ContainerWidth;
+                int maxValue = Math.Max(length, width);
+                int minValue = Math.Min(length, width);
+                if (minValue > container.ContainerWidth)
+                {
+                    containerLength = maxValue;
+                    containerWidth = minValue;
+                }
+                ContainerSize containerSize = new ContainerSize(containerLength, containerWidth, container.ContainerHeight);
+                TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks, edge);
+                if (taskPosition != null)
+                {
+                    taskPosition.PutPosition = container.ContainerCode;
+                    return (true, taskPosition, "");
+                }
+            }
+
+            return (false, null, "10002");
+        }
+
+        /// <summary>
+        /// 鏍规嵁璁㈠崟淇℃伅鑾峰彇鍙敤璐т綅浣嶇疆
+        /// </summary>
+        /// <param name="orderId">璁㈠崟ID</param>
+        /// <param name="orderNo">璁㈠崟缂栧彿</param>
+        /// <param name="length">鐗╁搧闀垮害</param>
+        /// <param name="width">鐗╁搧瀹藉害</param>
+        /// <param name="height">鐗╁搧楂樺害</param>
+        /// <returns>杩斿洖绗﹀悎鏉′欢鐨勪换鍔′綅缃俊鎭紝鑻ユ壘涓嶅埌鍒欒繑鍥瀗ull</returns>
+        /// <remarks>
+        /// 璇ユ柟娉曚細鏌ヨ璁㈠崟鍏宠仈鐨勫鍣紝骞舵鏌ユ瘡涓鍣ㄤ腑宸叉斁缃墿鍝佺殑甯冨眬锛� <br/>
+        /// 閫氳繃绠楁硶璁$畻鏂扮墿鍝佸湪瀹瑰櫒涓殑鏈�浣虫斁缃綅缃�
+        /// </remarks>
+        public TaskPosition? GetPositionByOrder(int orderId, string orderNo, int length, int width, int height)
+        {
+            List<Dt_OrderContainer> orderContainers = Db.Queryable<Dt_OrderContainer>().Where(it => it.OrderNo == orderNo && it.OrderId == orderId).ToList();
+            if (orderContainers != null && orderContainers.Count > 0)
+            {
+                List<Dt_Container> dt_Containers = Db.Queryable<Dt_Container>().ToList();
+
+                List<Dt_Container> containers = dt_Containers.Where(it => orderContainers.Any(x => x.ContainerId == it.Id && x.ContainerCode == it.ContainerCode) && it.ContainerEnable && it.ContainerStatus != ContainerStatusEnum.ReadyRelease.ObjToInt()).ToList().OrderBy(x => x.ContainerSort).ToList();
+
+                for (int i = 0; i < containers.Count; i++)
+                {
+                    containers[i].Items = Db.Queryable<Dt_ContainerItem>().Where(x => x.ContainerId == containers[i].Id).ToList();
+                }
 
                 foreach (var container in containers)
                 {
                     List<PlacedBlock> placedBlocks = new List<PlacedBlock>();
 
-                    if (container.Items != null && container.Items.Count > 0)
+                    foreach (var item in container.Items)
                     {
-                        foreach (var item in container.Items)
+                        int tempLength = item.ItemLength;
+                        int tempWidth = item.ItemWidth;
+
+                        if (item.ItemLength < item.ItemWidth)
                         {
-                            Point3D point3D = new Point3D(item.ItemPositionX, item.ItemPositionY, item.ItemPositionZ);
-                            placedBlocks.Add(new PlacedBlock(point3D, item.ItemLength, item.ItemWidth, item.ItemHeight));
+                            tempLength = item.ItemWidth;
+                            tempWidth = item.ItemLength;
                         }
 
-                        ContainerSize containerSize = new ContainerSize(container.ContainerLength, container.ContainerWidth, container.ContainerHeight);
-                        PlaceBlockService placeBlockService = new PlaceBlockService(containerSize, placedBlocks);
-                        Point3D? axis = placeBlockService.PlaceBlock(length, width, height);
-                        if (axis != null)
-                        {
-                            Dt_ContainerItem containerItem = new Dt_ContainerItem()
-                            {
-                                ContainerId = container.Id,
-                                ItemCode = "ItemCode",
-                                ItemHeight = height,
-                                ItemLength = length,
-                                ItemName = "ItemName",
-                                ItemPositionX = axis.Value.X,
-                                ItemPositionY = axis.Value.Y,
-                                ItemPositionZ = axis.Value.Z,
-                                ItemWidth = width,
-                                ItemStatus = ItemStatusEnum.Assigned.ObjToInt()
-                            };
-                            Db.Insertable(containerItem).ExecuteCommand();
-                        }
+                        Point3D point3D = new Point3D(item.ItemPositionX, item.ItemPositionY, item.ItemPositionZ);
+                        placedBlocks.Add(new PlacedBlock(point3D, tempLength, tempWidth, item.ItemHeight));
+                    }
+                    Dt_OrderContainer? orderContainer = orderContainers.FirstOrDefault(x => x.ContainerId == container.Id && x.ContainerCode == container.ContainerCode);
+                    if (orderContainer == null)
+                    {
+                        continue;
+                    }
+
+                    int edge = 0;
+                    if (container.ContainerNo == dt_Containers.Where(x => x.DeviceCode == container.DeviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Min(x => x.ContainerNo))
+                    {
+                        edge = 1;
+                    }
+
+                    ContainerSize containerSize = new ContainerSize(orderContainer.MaxLength, orderContainer.MaxWidth, container.ContainerHeight);
+                    TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks, edge);
+                    if (taskPosition != null)
+                    {
+                        taskPosition.PutPosition = container.ContainerCode;
+                        return taskPosition;
                     }
                 }
             }
+            return null;
+        }
+
+        /// <summary>
+        /// 閲婃斁鎸囧畾瀹瑰櫒鍙婂叾鍏宠仈椤�
+        /// </summary>
+        /// <param name="keys">瀹瑰櫒ID鏁扮粍</param>
+        /// <returns>鎿嶄綔缁撴灉鍝嶅簲</returns>
+        /// <remarks>
+        /// 1. 鏌ヨ骞惰幏鍙栨寚瀹氬鍣ㄥ強鍏跺叧鑱旈」 <br/>
+        /// 2. 鏇存柊瀹瑰櫒鐘舵�佷负绌洪棽 <br/>
+        /// 3. 鍦ㄤ簨鍔′腑鎵ц浠ヤ笅鎿嶄綔锛� <br/>
+        ///    - 鍒犻櫎瀹瑰櫒椤瑰苟绉诲叆鍘嗗彶琛� <br/>
+        ///    - 鍒犻櫎璁㈠崟瀹瑰櫒鍏宠仈骞剁Щ鍏ュ巻鍙茶〃 <br/>
+        ///    - 鏇存柊瀹瑰櫒鐘舵�� <br/>
+        /// 4. 鎿嶄綔鎴愬姛杩斿洖OK锛屽け璐ュ洖婊氫簨鍔″苟杩斿洖閿欒淇℃伅
+        /// </remarks>
+        public WebResponseContent ReleaseContainer(int[] keys)
+        {
+            try
+            {
+                List<Dt_Container> containers = Db.Queryable<Dt_Container>().Where(x => keys.Contains(x.Id)).Includes(x => x.Items).ToList();
+                List<Dt_ContainerItem> containerItems = new List<Dt_ContainerItem>();
+                List<Dt_OrderContainer> orderContainers = Db.Queryable<Dt_OrderContainer>().Where(x => containers.Select(x => x.Id).ToList().Contains(x.ContainerId)).ToList();
+
+                for (int i = 0; i < containers.Count; i++)
+                {
+                    containers[i].ContainerStatus = ContainerStatusEnum.Empty.ObjToInt();
+                    containerItems.AddRange(containers[i].Items);
+                }
+
+                _unitOfWorkManage.BeginTran();
+                _containerItemRepository.DeleteAndMoveIntoHty(containerItems, App.User?.UserId > 0 ? WIDESEAWCS_Core.Enums.OperateTypeEnum.浜哄伐鍒犻櫎 : WIDESEAWCS_Core.Enums.OperateTypeEnum.鑷姩鍒犻櫎);
+                _orderContainerRepository.DeleteAndMoveIntoHty(orderContainers, App.User?.UserId > 0 ? WIDESEAWCS_Core.Enums.OperateTypeEnum.浜哄伐鍒犻櫎 : WIDESEAWCS_Core.Enums.OperateTypeEnum.鑷姩鍒犻櫎);
+                Db.Updateable(containers).ExecuteCommand();
+                _unitOfWorkManage.CommitTran();
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+        public WebResponseContent AutoReleaseContainer(int[] keys)
+        {
+            try
+            {
+                List<Dt_Container> containers = Db.Queryable<Dt_Container>().Where(x => keys.Contains(x.Id)).Includes(x => x.Items).ToList();
+
+                for (int i = 0; i < containers.Count; i++)
+                {
+                    AutoReleaseContainer(containers[i].ContainerCode);
+                }
+
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// 鑷姩閲婃斁瀹瑰櫒
+        /// </summary>
+        /// <param name="containerCode">瀹瑰櫒缂栧彿</param>
+        /// <returns>Web鍝嶅簲缁撴灉</returns>
+        /// <remarks>
+        /// 1. 鏍规嵁瀹瑰櫒缂栧彿鏌ヨ瀹瑰櫒淇℃伅 <br/>
+        /// 2. 妫�鏌ュ鍣ㄦ槸鍚﹀瓨鍦ㄥ叧鑱斾换鍔� <br/>
+        /// 3. 鑻ユ棤浠诲姟鍒欐竻绌哄鍣ㄧ姸鎬佸苟鍒犻櫎璁㈠崟瀹瑰櫒璁板綍 <br/>
+        /// 4. 鑻ユ湁浠诲姟鍒欐洿鏂颁换鍔$姸鎬佷负"榫欓棬鏋堕噸鏂板垎閰�" <br/>
+        /// 5. 浜嬪姟澶勭悊鎵�鏈夋暟鎹簱鎿嶄綔
+        /// </remarks>
+        public WebResponseContent AutoReleaseContainer(string containerCode)
+        {
+            try
+            {
+                Dt_Container container = BaseDal.QueryFirst(x => x.ContainerCode == containerCode);
+                if (container == null)
+                {
+                    return WebResponseContent.Instance.Error("瀹瑰櫒涓嶅瓨鍦�");
+                }
+
+                if (container.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt())
+                {
+                    return WebResponseContent.Instance.Error("瀹瑰櫒宸插浜庣┖闂茬姸鎬�");
+                }
+
+                if (container.ContainerType == ContainerTypeEnum.ExceptionContainer.ObjToInt())
+                {
+                    if (container.Items != null && container.Items.Count > 0)
+                    {
+                        _containerItemRepository.DeleteAndMoveIntoHty(container.Items, App.User?.UserId > 0 ? WIDESEAWCS_Core.Enums.OperateTypeEnum.浜哄伐鍒犻櫎 : WIDESEAWCS_Core.Enums.OperateTypeEnum.鑷姩鍒犻櫎);
+                    }
+                    return WebResponseContent.Instance.OK("寮傚父宸ヤ綅宸查噴鏀�");
+                }
+                List<Dt_Task> tasks = _taskRepository.QueryData(x => x.NextAddress.Contains(container.ContainerCode));
+
+                Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.ContainerCode == container.ContainerCode && x.ContainerId == container.Id);
+
+                if (tasks != null && tasks.Count > 0)
+                {
+                    List<string> codes = tasks.Select(x => x.PalletCode).ToList();
+
+                    container.Items = _containerItemRepository.QueryData(x => x.ContainerId == container.Id && !codes.Contains(x.ItemCode));
+
+                    if (container.ContainerType == ContainerTypeEnum.ExceptionContainer.ObjToInt())
+                    {
+                        tasks.ForEach(x =>
+                        {
+                            if (x.TaskState == TaskStatusEnum.Gantry_BeRelease.ObjToInt())
+                            {
+                                x.TaskState = TaskStatusEnum.Gantry_New.ObjToInt();
+                            }
+                        });
+                    }
+                    else
+                    {
+                        tasks.ForEach(x =>
+                        {
+                            if (x.TaskState == TaskStatusEnum.Gantry_Wait.ObjToInt())
+                            {
+                                x.TaskState = TaskStatusEnum.Gantry_BeReassign.ObjToInt();
+                            }
+                        });
+                    }
+                }
+                else
+                {
+                    container.Items = _containerItemRepository.QueryData(x => x.ContainerId == container.Id);
+                }
+
+                _unitOfWorkManage.BeginTran();
+                if (container.Items != null && container.Items.Count > 0)
+                {
+                    _containerItemRepository.DeleteAndMoveIntoHty(container.Items, App.User?.UserId > 0 ? WIDESEAWCS_Core.Enums.OperateTypeEnum.浜哄伐鍒犻櫎 : WIDESEAWCS_Core.Enums.OperateTypeEnum.鑷姩鍒犻櫎);
+                }
+
+                if (tasks == null || tasks.Count == 0)
+                {
+                    container.ContainerStatus = ContainerStatusEnum.Empty.ObjToInt();
+
+                    BaseDal.UpdateData(container);
+                    if (orderContainer != null)
+                    {
+                        _orderContainerRepository.DeleteAndMoveIntoHty(orderContainer, App.User?.UserId > 0 ? WIDESEAWCS_Core.Enums.OperateTypeEnum.浜哄伐鍒犻櫎 : WIDESEAWCS_Core.Enums.OperateTypeEnum.鑷姩鍒犻櫎);
+                    }
+                }
+                else
+                {
+                    orderContainer.MaxLength = container.ContainerLength;
+                    orderContainer.MaxWidth = container.ContainerWidth;
+                    _orderContainerRepository.UpdateData(orderContainer);
+                    _taskRepository.UpdateData(tasks);
+                }
+
+                _unitOfWorkManage.CommitTran();
+
+                //_webSocketServer鍙戦�佹暟鎹�
+                _webSocketServer.PublishAllClientPayload(new
+                {
+                    stationCode = container.ContainerCode,
+                    release = 1,
+                }.Serialize());
+
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
         }
     }
-
-
 }
\ No newline at end of file

--
Gitblit v1.9.3