1
z8018
2025-05-05 b6837f097e9cdb2645368aed4ddb03f580c331e4
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ContainerService.cs
@@ -6,8 +6,11 @@
using AutoMapper;
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;
@@ -19,142 +22,45 @@
    public class ContainerService : ServiceBase<Dt_Container, IContainerRepository>, IContainerService
    {
        private readonly IMapper _mapper;
        int lengthThreshold = AppSettings.Get("LengthThreshold").ObjToInt();
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IContainerItemRepository _containerItemRepository;
        private readonly IOrderContainerRepository _orderContainerRepository;
        public ContainerService(IContainerRepository BaseDal, IMapper mapper) : base(BaseDal)
        public ContainerService(IContainerRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IContainerItemRepository containerItemRepository, IOrderContainerRepository orderContainerRepository) : base(BaseDal)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
            _containerItemRepository = containerItemRepository;
            _orderContainerRepository = orderContainerRepository;
        }
        public TaskPosition? GetTaskPosition(int length, int width, int height, ContainerSize containerSize, List<PlacedBlock> placedBlocks)
        public SuctionInfo GetPlacementResult(Block block, List<Block> blocks)
        {
            ContainerPlacer containerPlacer = new ContainerPlacer();
            return containerPlacer.CalculatePlacement(block, blocks);
        }
        /// <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></returns>
        /// <exception cref="Exception"></exception>
        public TaskPosition? GetTaskPosition(int length, int width, int height, ContainerSize containerSize, List<PlacedBlock> placedBlocks, int edge)
        {
            try
            {
                PlaceBlockService placeBlockService = new PlaceBlockService(containerSize, placedBlocks);
                Point3D? point3D = placeBlockService.PlaceBlock(length, width, height);
                if (point3D == null)
                {
                    return 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)
                {
                    //
                    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
                };
                TaskPosition? taskPosition = placeBlockService.PlaceBlock(length, width, height, edge);
                return taskPosition;
            }
            catch (Exception ex)
@@ -163,156 +69,60 @@
            }
        }
        //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)
        public (bool, TaskPosition?, string) GetPosition(int orderId, string orderNo, int length, int width, int height)
        {
            TaskPosition? taskPosition = GetPositionByOrder(orderNo, length, width, height);
            TaskPosition? taskPosition = GetPositionByOrder(orderId, orderNo, length, width, height);
            if (taskPosition != null)
            {
                return taskPosition;
                return (true, taskPosition, "");
            }
            taskPosition = GetPosition(length, width, height);
            if (taskPosition != null)
            {
                return taskPosition;
                return (true, taskPosition, "");
            }
            throw new Exception("10001");
            return (true, taskPosition, "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>();
            List<Dt_Container> containers = Db.Queryable<Dt_Container>().Where(x => x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Includes(x => x.Items).ToList();
            if (container.Items != null && container.Items.Count > 0)
            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 && (containers.Any(x => (x.Items.Any(v => v.ItemLength > 1600 || v.ItemWidth > 1600)) && x.DeviceCode == container.DeviceCode) || containers.Where(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt() && x.ContainerEnable && x.DeviceCode == container.DeviceCode).Count() > 1 || length > 1600 || width > 1600))
            {
                foreach (var item in container.Items)
                int edge = 0;
                if (container.ContainerNo == containers.Where(x => x.DeviceCode == container.DeviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Min(x => x.ContainerNo))
                {
                    Point3D point3D = new Point3D(item.ItemRelaPositionX, item.ItemRelaPositionY, item.ItemRelaPositionZ);
                    placedBlocks.Add(new PlacedBlock(point3D, item.ItemLength, item.ItemWidth, item.ItemHeight));
                    edge = 1;
                }
                ContainerSize containerSize = new ContainerSize(container.ContainerLength, container.ContainerWidth, container.ContainerHeight);
                TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks, edge);
                if (taskPosition != null)
                {
                    taskPosition.PutPosition = container.ContainerCode;
                    return taskPosition;
                }
            }
            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;
            }
            return null;
        }
        public TaskPosition? GetPositionByOrder(string orderNo, int length, int width, int height)
        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).ToList();
            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> 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(); ;
                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)
                {
@@ -320,31 +130,79 @@
                    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 tempLength = item.ItemLength;
                        int tempWidth = item.ItemWidth;
                        if (item.ItemLength < item.ItemWidth)
                        {
                            tempLength = item.ItemWidth;
                            tempWidth = item.ItemLength;
                        }
                        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 == x.Id && x.ContainerCode == x.ContainerCode);
                    int containerLength = container.ContainerLength;
                    if (length < lengthThreshold)
                    int edge = 0;
                    if (container.ContainerNo == dt_Containers.Where(x => x.DeviceCode == container.DeviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Min(x => x.ContainerNo))
                    {
                        containerLength = lengthThreshold;
                        edge = 1;
                    }
                    else
                    {
                        if (orderContainer != null)
                            containerLength = orderContainer.MaxLength;
                    }
                    ContainerSize containerSize = new ContainerSize(containerLength, container.ContainerWidth, container.ContainerHeight);
                    TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks);
                    ContainerSize containerSize = new ContainerSize(container.ContainerLength, container.ContainerWidth, container.ContainerHeight);
                    TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks, edge);
                    if (taskPosition != null)
                    {
                        taskPosition.PutPosition = container.ContainerCode;
                        return taskPosition;
                    }
                    //else
                    //{
                    //    if (LightStatusStorage.LightStatusDic.ContainsKey(container.ContainerCode))//LightStatusEnum
                    //    {
                    //        LightStatusStorage.LightStatusDic[container.ContainerCode] = LightStatusEnum.ReadyRelease;
                    //        if (container.Items.Count > 10)
                    //        {
                    //            container.ContainerStatus = ContainerStatusEnum.ReadyRelease.ObjToInt();
                    //            BaseDal.UpdateData(container);
                    //        }
                    //    }
                    //}
                }
            }
            return null;
        }
        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);
            }
        }
    }