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;
}
}
}