From 1f361850d35ba47225951efbc49d592eea685cf8 Mon Sep 17 00:00:00 2001
From: z8018 <1282578289@qq.com>
Date: 星期三, 16 四月 2025 17:35:53 +0800
Subject: [PATCH] 1

---
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ContainerService.cs |  349 ++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 303 insertions(+), 46 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 3f9c1a7..d4d0e33 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"
@@ -8,6 +8,8 @@
 using WIDESEAWCS_Common;
 using WIDESEAWCS_Core.BaseServices;
 using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_DTO.PlacedBlockDTO;
+using WIDESEAWCS_DTO.TaskInfo;
 using WIDESEAWCS_IBasicInfoRepository;
 using WIDESEAWCS_IBasicInfoService;
 using WIDESEAWCS_Model.Models;
@@ -17,76 +19,331 @@
     public class ContainerService : ServiceBase<Dt_Container, IContainerRepository>, IContainerService
     {
         private readonly IMapper _mapper;
+        int lengthThreshold = AppSettings.Get("LengthThreshold").ObjToInt();
 
         public ContainerService(IContainerRepository BaseDal, IMapper mapper) : base(BaseDal)
         {
             _mapper = mapper;
         }
 
-        public void GetPosition(string orderNo, int length, int width, int height)
+        public TaskPosition? GetTaskPosition(int length, int width, int height, ContainerSize containerSize, List<PlacedBlock> placedBlocks)
         {
-            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);
+
+                Point3D? point3D = placeBlockService.PlaceBlock(length, width, height);
+                if (point3D == null)
                 {
-                    Dt_Container container = Db.Queryable<Dt_Container>().OrderBy(x => x.ContainerSort).First(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt());
-                    if (container != null)
-                    {
-                        Dt_OrderContainer containerInfo = _mapper.Map<Dt_OrderContainer>(container);
-                        containerInfos.Add(containerInfo);
-                    }
+                    return null;
                 }
-            }
-            else
-            {
-                Dt_Container container = Db.Queryable<Dt_Container>().OrderBy(x => x.ContainerSort).First(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt());
-                if (container != null)
+
+                //鏀捐揣浣嶇疆鏉挎潗涓績鐐�
+                Point3D putCenter = new Point3D(point3D.Value.X + length / 2, point3D.Value.Y + width / 2, point3D.Value.Z + height / 2);
+
+                //鍙栬揣浣嶇疆鏉挎潗涓績鐐�
+                Point3D takeCenter = new Point3D(length / 2, width / 2, height / 2);
+
+                //鍚哥洏闀�530 闂撮殧660  鏈�澶�920 鍚哥洏瀹�130
+
+                int positionR = 1;
+
+                int takePositionX = 0;
+                int takePositionY = 0;
+                int takePositionZ = 0;
+                int putPositionX = 0;
+                int putPositionY = 0;
+                int putPositionZ = 0;
+
+                //1.濡傛灉闀垮害澶т簬920锛屽搴﹀ぇ浜庣瓑浜�300锛屽垯鍙互浣跨敤鍙屽惛鐩樻í鍚戝惛鍙�
+                if (length > 920 && width >= 100)
                 {
-                    containerInfos = _mapper.Map<List<Dt_OrderContainer>>(container);
+                    //
+                    Point3D deviceCenter = new Point3D(530 / 2, 920 / 2, 0);
+
+                    positionR = 1;
+                    takePositionX = (takeCenter.Y - deviceCenter.X);
+                    takePositionY = (takeCenter.X - deviceCenter.Y);
+                    takePositionZ = 10;
+
+                    putPositionX = (putCenter.Y - deviceCenter.X);
+                    putPositionY = (putCenter.X - deviceCenter.Y);
+                    putPositionZ = point3D.Value.Z; // putCenter.Z /*+ 10*/;
+                }
+                else if (length < 450)
+                {
+                    Point3D deviceCenter = new Point3D(530 / 2, 130 / 2, 0);
+
+                    positionR = 1;
+                    takePositionX = (takeCenter.Y - deviceCenter.X);
+                    takePositionY = (takeCenter.X - deviceCenter.Y);
+                    takePositionZ = 10;
+
+                    putPositionX = (putCenter.Y - deviceCenter.X);
+                    putPositionY = (putCenter.X - deviceCenter.Y);
+                    putPositionZ = point3D.Value.Z; // putCenter.Z /*+ 10*/;
+                }
+                else
+                {
+                    positionR = 0;
+                    Point3D deviceCenter = new Point3D(130 / 2, 530 / 2, 0);
+                    takePositionX = (takeCenter.Y - deviceCenter.X);
+                    takePositionY = (takeCenter.X - deviceCenter.Y);
+                    takePositionZ = 10;
+
+                    putPositionX = (putCenter.Y - deviceCenter.X);
+                    putPositionY = (putCenter.X - deviceCenter.Y);
+                    putPositionZ = point3D.Value.Z; //putCenter.Z /*+ 10*/;
+                }
+
+                if (positionR == 1 && takePositionY < 155)
+                {
+                    takePositionY = 0;
+
+                    putPositionY = point3D.Value.X + 155;
+                }
+                else if (positionR == 1 && takePositionY >= 880)
+                {
+                    takePositionY = 880 - 155;
+                    putPositionY = 880;
+                }
+                else
+                {
+                    takePositionY -= 155;
+                }
+
+                if (positionR == 0 && takePositionY < 350)
+                {
+                    takePositionY = 0;
+
+                    putPositionY = point3D.Value.X + 350;
+                }
+                else if (positionR == 0 && takePositionY >= 350 && takePositionY <= 880)
+                {
+                    takePositionY -= 350;
+                }
+                else if (positionR == 0 && takePositionY >= 880)
+                {
+                    takePositionY = 880 - 350;
+                    putPositionY = 880;
+                }
+
+                if (putPositionX < -20)
+                {
+                    takePositionX = -40;
+                    //point3D.X += -20;
+                    putPositionX = point3D.Value.Y - 40;
+                }
+
+                TaskPosition taskPosition = new TaskPosition()
+                {
+                    PositionR = positionR,
+                    TakePositionX = takePositionX,
+                    TakePositionY = takePositionY,
+                    TakePositionZ = takePositionZ,
+                    PutPositionX = putPositionX,
+                    PutPositionY = putPositionY,
+                    PutPositionZ = putPositionZ,
+                    TakeCenterPositionX = takeCenter.X,
+                    TakeCenterPositionY = takeCenter.Y,
+                    TakeCenterPositionZ = takeCenter.Z,
+                    PutCenterPositionX = putCenter.X,
+                    PutCenterPositionY = putCenter.Y,
+                    PutCenterPositionZ = putCenter.Z,
+                    PositionX = point3D.Value.X,
+                    PositionY = point3D.Value.Y,
+                    PositionZ = point3D.Value.Z
+                };
+
+                return taskPosition;
+            }
+            catch (Exception ex)
+            {
+                throw new Exception(ex.Message);
+            }
+        }
+
+        //public TaskPosition? GetPosition(string orderNo, int length, int width, int height)
+        //{
+        //    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 && orderContainers.Count > 0)
+        //    {
+        //        containerInfos = orderContainers;
+        //        if (containerInfos.Count == 1)
+        //        {
+        //            Dt_Container container = Db.Queryable<Dt_Container>().OrderBy(x => x.ContainerSort).First(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt() && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt() && x.ContainerEnable);
+        //            if (container != null)
+        //            {
+        //                Dt_OrderContainer containerInfo = _mapper.Map<Dt_OrderContainer>(container);
+        //                containerInfos.Add(containerInfo);
+        //            }
+        //            else
+        //            {
+        //                Dt_Container containerItem = Db.Queryable<Dt_Container>().Where(x => x.ContainerStatus == ContainerStatusEnum.NonEmpty.ObjToInt() && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt() && x.ContainerEnable).Includes(x => x.Items).OrderByDescending(x => x.Items.Count).First();
+        //                if (containerItem != null)
+        //                {
+        //                    if (LightStatusStorage.LightStatusDic.TryGetValue(containerItem.ContainerCode, out LightStatusEnum lightStatus))
+        //                    {
+        //                        if (lightStatus != LightStatusEnum.ReadyRelease)
+        //                        {
+        //                            LightStatusStorage.LightStatusDic[containerItem.ContainerCode] = LightStatusEnum.ReadyRelease;
+
+        //                            Dt_OrderContainer containerInfo = _mapper.Map<Dt_OrderContainer>(containerItem);
+        //                            containerInfos.Add(containerInfo);
+        //                        }
+        //                    }
+        //                }
+        //                else
+        //                {
+        //                    throw new Exception($"鏈壘鍒板彲鏀捐揣浣嶇疆,璇锋鏌ユ暟鎹槸鍚﹀凡娣诲姞鎴栬�呭伐浣嶈绂佺敤");
+        //                }
+        //            }
+        //        }
+        //    }
+        //    else
+        //    {
+        //        Dt_Container container = Db.Queryable<Dt_Container>().OrderBy(x => x.ContainerSort).First(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt() && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt() && x.ContainerEnable);
+        //        if (container != null)
+        //        {
+        //            containerInfos.Add(_mapper.Map<Dt_OrderContainer>(container));
+        //        }
+        //        else
+        //        {
+        //            Dt_Container containerItem = Db.Queryable<Dt_Container>().Where(x => x.ContainerStatus == ContainerStatusEnum.NonEmpty.ObjToInt() && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt() && x.ContainerEnable).Includes(x => x.Items).OrderByDescending(x => x.Items.Count()).First();
+        //            if (containerItem != null)
+        //            {
+        //                if (LightStatusStorage.LightStatusDic.TryGetValue(containerItem.ContainerCode, out LightStatusEnum lightStatus))
+        //                {
+        //                    if (lightStatus != LightStatusEnum.ReadyRelease)
+        //                    {
+        //                        LightStatusStorage.LightStatusDic[containerItem.ContainerCode] = LightStatusEnum.ReadyRelease;
+
+        //                        Dt_OrderContainer containerInfo = _mapper.Map<Dt_OrderContainer>(containerItem);
+        //                        containerInfos.Add(containerInfo);
+        //                    }
+        //                }
+        //            }
+        //            else
+        //            {
+        //                throw new Exception($"鏈壘鍒板彲鏀捐揣浣嶇疆,璇锋鏌ユ暟鎹槸鍚﹀凡娣诲姞鎴栬�呭伐浣嶈绂佺敤");
+        //            }
+        //        }
+        //    }
+
+        //    {
+        //        List<Dt_Container> containers = Db.Queryable<Dt_Container>().Where(it => containerInfos.Any(x => x.ContainerId == it.Id && x.ContainerCode == it.ContainerCode) && it.ContainerEnable).Includes(x => x.Items).ToList().OrderBy(x => x.ContainerSort).ToList();
+
+        //        foreach (var container in containers)
+        //        {
+        //            List<PlacedBlock> placedBlocks = new List<PlacedBlock>();
+
+        //            foreach (var item in container.Items)
+        //            {
+        //                Point3D point3D = new Point3D(item.ItemRelaPositionX, item.ItemRelaPositionY, item.ItemRelaPositionZ);
+        //                placedBlocks.Add(new PlacedBlock(point3D, item.ItemLength, item.ItemWidth, item.ItemHeight));
+        //            }
+        //            Dt_OrderContainer? orderContainer = containerInfos.FirstOrDefault(x => x.ContainerId == x.Id && x.ContainerCode == x.ContainerCode);
+        //            int containerLength = container.ContainerLength;
+        //            if (length < lengthThreshold)
+        //            {
+        //                containerLength = lengthThreshold;
+        //            }
+        //            ContainerSize containerSize = new ContainerSize(containerLength, container.ContainerWidth, container.ContainerHeight);
+        //            TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks);
+        //            if (taskPosition != null)
+        //            {
+        //                taskPosition.PutPosition = container.ContainerCode;
+        //                return taskPosition;
+        //            }
+        //            throw new Exception("10001");
+
+        //        }
+        //    }
+        //    return null;
+        //}
+
+        public TaskPosition? GetPosition(string orderNo, int length, int width, int height)
+        {
+            TaskPosition? taskPosition = GetPositionByOrder(orderNo, length, width, height);
+            if (taskPosition != null)
+            {
+                return taskPosition;
+            }
+            taskPosition = GetPosition(length, width, height);
+            if (taskPosition != null)
+            {
+                return taskPosition;
+            }
+            throw new Exception("10001");
+        }
+
+        public TaskPosition? GetPosition(int length, int width, int height)
+        {
+            Dt_Container container = Db.Queryable<Dt_Container>().OrderBy(x => x.ContainerSort).First(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt() && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt() && x.ContainerEnable);
+            List<PlacedBlock> placedBlocks = new List<PlacedBlock>();
+
+            if (container.Items != null && container.Items.Count > 0)
+            {
+                foreach (var item in container.Items)
+                {
+                    Point3D point3D = new Point3D(item.ItemRelaPositionX, item.ItemRelaPositionY, item.ItemRelaPositionZ);
+                    placedBlocks.Add(new PlacedBlock(point3D, item.ItemLength, item.ItemWidth, item.ItemHeight));
                 }
             }
 
+            int containerLength = container.ContainerLength;
+            if (length < lengthThreshold)
             {
-                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();
+                containerLength = lengthThreshold;
+            }
+            ContainerSize containerSize = new ContainerSize(containerLength, container.ContainerWidth, container.ContainerHeight);
+            TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks);
+            if (taskPosition != null)
+            {
+                taskPosition.PutPosition = container.ContainerCode;
+                return taskPosition;
+            }
+            return null;
+        }
+
+        public TaskPosition? GetPositionByOrder(string orderNo, int length, int width, int height)
+        {
+            List<Dt_OrderContainer> orderContainers = Db.Queryable<Dt_OrderContainer>().Where(it => it.OrderNo == orderNo).ToList();
+            if (orderContainers != null && orderContainers.Count > 0)
+            {
+                List<Dt_Container> containers = Db.Queryable<Dt_Container>().Where(it => orderContainers.Any(x => x.ContainerId == it.Id && x.ContainerCode == it.ContainerCode) && it.ContainerEnable).Includes(x => x.Items).ToList().OrderBy(x => x.ContainerSort).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)
-                        {
-                            Point3D point3D = new Point3D(item.ItemPositionX, item.ItemPositionY, item.ItemPositionZ);
-                            placedBlocks.Add(new PlacedBlock(point3D, item.ItemLength, item.ItemWidth, item.ItemHeight));
-                        }
-
-                        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.ItemRelaPositionX, item.ItemRelaPositionY, item.ItemRelaPositionZ);
+                        placedBlocks.Add(new PlacedBlock(point3D, item.ItemLength, item.ItemWidth, item.ItemHeight));
+                    }
+                    Dt_OrderContainer? orderContainer = orderContainers.FirstOrDefault(x => x.ContainerId == x.Id && x.ContainerCode == x.ContainerCode);
+                    int containerLength = container.ContainerLength;
+                    if (length < lengthThreshold)
+                    {
+                        containerLength = lengthThreshold;
+                    }
+                    else
+                    {
+                        if (orderContainer != null)
+                            containerLength = orderContainer.MaxLength;
+                    }
+                    ContainerSize containerSize = new ContainerSize(containerLength, container.ContainerWidth, container.ContainerHeight);
+                    TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks);
+                    if (taskPosition != null)
+                    {
+                        taskPosition.PutPosition = container.ContainerCode;
+                        return taskPosition;
                     }
                 }
             }
+            return null;
         }
     }
 

--
Gitblit v1.9.3