using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO.PlacedBlockDTO; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_IBasicInfoService; namespace WIDESEAWCS_BasicInfoService { /// /// 异常放置区块服务,用于计算和处理异常情况下的货物放置位置 /// /// /// 该类根据容器尺寸和货物尺寸计算取放位置坐标, /// 包含横向Y坐标的最小/最大限制处理逻辑, /// 并返回包含完整位置信息的TaskPosition对象 /// public class ExceptionPlaceBlockService { public ContainerSize ContainerSize { get; private set; } /// /// 最小横向Y坐标限制(毫米) /// public static int MinY = AppSettings.GetValue("MinY").ObjToInt(); /// /// 最大Y坐标限制(毫米) /// public const int MaxY = 600; /// /// 构造函数,初始化异常位置区块服务 /// /// 容器尺寸参数 public ExceptionPlaceBlockService(ContainerSize containerSize) { ContainerSize = containerSize; } /// /// 计算异常放置块的任务位置 /// /// 物品长度 /// 物品宽度 /// 物品高度 /// 物品数量 /// 包含取放位置信息的TaskPosition对象 /// /// 该方法会根据物品尺寸自动调整取放位置: /// 1. 当长度小于宽度时会交换两者 /// 2. 根据物品尺寸选择不同的设备中心点 /// 3. 确保Y轴位置在MinY和MaxY之间 /// public TaskPosition ExceptionPlaceBlock(int length, int width, int height, int count) { int tempLength = length; int tempWidth = width; if (length < width) { length = tempWidth; width = tempLength; } int takePositionX = 0; int takePositionY = 0; int takePositionZ = 0; int putPositionX = 0; int putPositionY = 0; int putPositionZ = 0; Point3D deviceCenter = new Point3D(530 / 2, 920 / 2, 0); if (length <= 920) //横向双吸 { deviceCenter = new Point3D(530 / 2, 130 / 2, 0); } takePositionX = width / 2 - deviceCenter.X; takePositionY = length / 2 - deviceCenter.Y; takePositionZ = 10; putPositionX = ContainerSize.Width / 2 - deviceCenter.X; putPositionY = takePositionY; putPositionZ = count * height; if (takePositionY < MinY) { takePositionY = 0; putPositionY = MinY; } else { takePositionY -= MinY; } if (putPositionY > MaxY) { int moreY = putPositionY - MaxY; if (takePositionY - moreY > 0) { takePositionY -= moreY; putPositionY = MaxY; } } TaskPosition taskPosition = new TaskPosition() { PositionR = 1, TakePositionX = takePositionX, TakePositionY = takePositionY, TakePositionZ = takePositionZ, PutPositionX = putPositionX, PutPositionY = putPositionY, PutPositionZ = putPositionZ, TakeCenterPositionX = takePositionX, TakeCenterPositionY = takePositionY, TakeCenterPositionZ = takePositionZ, PutCenterPositionX = putPositionX, PutCenterPositionY = putPositionY, PutCenterPositionZ = putPositionZ, PositionX = putPositionX, PositionY = putPositionY, PositionZ = putPositionZ }; return taskPosition; } } }