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 | 203 +++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 159 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 3f9c1a7..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,13 @@ 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; using WIDESEAWCS_IBasicInfoService; using WIDESEAWCS_Model.Models; @@ -17,76 +22,186 @@ public class ContainerService : ServiceBase<Dt_Container, IContainerRepository>, IContainerService { private readonly IMapper _mapper; + 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 void GetPosition(string orderNo, int length, int width, int height) + public SuctionInfo GetPlacementResult(Block block, List<Block> blocks) { - 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) + 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 { - containerInfos = orderContainers; - if (containerInfos.Count == 1) - { - 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); - } - } + + PlaceBlockService placeBlockService = new PlaceBlockService(containerSize, placedBlocks); + + TaskPosition? taskPosition = placeBlockService.PlaceBlock(length, width, height, edge); + return taskPosition; } - else + catch (Exception ex) { - Dt_Container container = Db.Queryable<Dt_Container>().OrderBy(x => x.ContainerSort).First(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt()); - if (container != null) + throw new Exception(ex.Message); + } + } + + 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 (true, taskPosition, "10001"); + } + + 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 && (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)) + { + 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>>(container); + 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; } } + return null; + } + + 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> containers = Db.Queryable<Dt_Container>().Where(it => containerInfos.Any(x => x.ContainerId == it.Id && x.ContainerCode == it.ContainerCode)).Includes(x => x.Items).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) { 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 == x.Id && x.ContainerCode == x.ContainerCode); + + 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(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