From b6837f097e9cdb2645368aed4ddb03f580c331e4 Mon Sep 17 00:00:00 2001 From: z8018 <1282578289@qq.com> Date: 星期一, 05 五月 2025 17:29:07 +0800 Subject: [PATCH] 1 --- 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_BasicInfoService/ContainerService.cs | 386 +++++++++++++++++------------------------------------- 1 files changed, 122 insertions(+), 264 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 d4d0e33..4335873 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" @@ -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); + } + } } -- Gitblit v1.9.3