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 | 695 +++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 430 insertions(+), 265 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..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,157 +4,100 @@ 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_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; - int lengthThreshold = AppSettings.Get("LengthThreshold").ObjToInt(); + /// <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 TaskPosition? GetTaskPosition(int length, int width, int height, ContainerSize containerSize, List<PlacedBlock> placedBlocks) + /// <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) { 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 +106,196 @@ } } - //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) + /// <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) { - TaskPosition? taskPosition = GetPositionByOrder(orderNo, length, width, 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)) + { + LightStatusStorage.LightStatusDic[container.ContainerCode] = LightStatusEnum.LightError; + } + return (true, taskPosition, ""); + } + else + { + 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 taskPosition; + return (true, taskPosition, ""); } taskPosition = GetPosition(length, width, height); if (taskPosition != null) { - return taskPosition; + return (true, taskPosition, ""); } - throw new Exception("10001"); + 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) { - 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) { - 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; + } + 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; } } - 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) + /// <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_OrderContainer> orderContainers = Db.Queryable<Dt_OrderContainer>().Where(it => it.OrderNo == orderNo).ToList(); + 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) + { + 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> 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,22 +303,32 @@ 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) + Dt_OrderContainer? orderContainer = orderContainers.FirstOrDefault(x => x.ContainerId == container.Id && x.ContainerCode == container.ContainerCode); + if (orderContainer == null) { - containerLength = lengthThreshold; + continue; } - else + + int edge = 0; + if (container.ContainerNo == dt_Containers.Where(x => x.DeviceCode == container.DeviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Min(x => x.ContainerNo)) { - if (orderContainer != null) - containerLength = orderContainer.MaxLength; + edge = 1; } - ContainerSize containerSize = new ContainerSize(containerLength, container.ContainerWidth, container.ContainerHeight); - TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks); + + 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; @@ -345,7 +338,179 @@ } 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