using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AutoMapper; using WIDESEAWCS_BasicInfoService; 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; namespace WIDESEAWCS_BasicInfoService { public class ContainerService : ServiceBase, IContainerService { private readonly IMapper _mapper; int lengthThreshold = AppSettings.Get("LengthThreshold").ObjToInt(); public ContainerService(IContainerRepository BaseDal, IMapper mapper) : base(BaseDal) { _mapper = mapper; } public TaskPosition? GetTaskPosition(int length, int width, int height, ContainerSize containerSize, List placedBlocks) { 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 }; return taskPosition; } catch (Exception ex) { throw new Exception(ex.Message); } } //public TaskPosition? GetPosition(string orderNo, int length, int width, int height) //{ // List containerInfos = new List(); // List orderContainers = Db.Queryable().Where(it => it.OrderNo == orderNo).ToList(); // if (orderContainers != null && orderContainers.Count > 0) // { // containerInfos = orderContainers; // if (containerInfos.Count == 1) // { // Dt_Container container = Db.Queryable().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(container); // containerInfos.Add(containerInfo); // } // else // { // Dt_Container containerItem = Db.Queryable().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(containerItem); // containerInfos.Add(containerInfo); // } // } // } // else // { // throw new Exception($"未找到可放货位置,请检查数据是否已添加或者工位被禁用"); // } // } // } // } // else // { // Dt_Container container = Db.Queryable().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(container)); // } // else // { // Dt_Container containerItem = Db.Queryable().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(containerItem); // containerInfos.Add(containerInfo); // } // } // } // else // { // throw new Exception($"未找到可放货位置,请检查数据是否已添加或者工位被禁用"); // } // } // } // { // List containers = Db.Queryable().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 placedBlocks = new List(); // 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().OrderBy(x => x.ContainerSort).First(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt() && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt() && x.ContainerEnable); List placedBlocks = new List(); 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) { 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 orderContainers = Db.Queryable().Where(it => it.OrderNo == orderNo).ToList(); if (orderContainers != null && orderContainers.Count > 0) { List containers = Db.Queryable().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 placedBlocks = new List(); 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 = 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; } } }