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
|
{
|
/// <summary>
|
/// 异常放置区块服务,用于计算和处理异常情况下的货物放置位置
|
/// </summary>
|
/// <remarks>
|
/// 该类根据容器尺寸和货物尺寸计算取放位置坐标,
|
/// 包含横向Y坐标的最小/最大限制处理逻辑,
|
/// 并返回包含完整位置信息的TaskPosition对象
|
/// </remarks>
|
public class ExceptionPlaceBlockService
|
{
|
public ContainerSize ContainerSize { get; private set; }
|
|
/// <summary>
|
/// 最小横向Y坐标限制(毫米)
|
/// </summary>
|
public static int MinY = AppSettings.GetValue("MinY").ObjToInt();
|
|
/// <summary>
|
/// 最大Y坐标限制(毫米)
|
/// </summary>
|
public const int MaxY = 600;
|
|
/// <summary>
|
/// 构造函数,初始化异常位置区块服务
|
/// </summary>
|
/// <param name="containerSize">容器尺寸参数</param>
|
public ExceptionPlaceBlockService(ContainerSize containerSize)
|
{
|
ContainerSize = containerSize;
|
}
|
|
/// <summary>
|
/// 计算异常放置块的任务位置
|
/// </summary>
|
/// <param name="length">物品长度</param>
|
/// <param name="width">物品宽度</param>
|
/// <param name="height">物品高度</param>
|
/// <param name="count">物品数量</param>
|
/// <returns>包含取放位置信息的TaskPosition对象</returns>
|
/// <remarks>
|
/// 该方法会根据物品尺寸自动调整取放位置:
|
/// 1. 当长度小于宽度时会交换两者
|
/// 2. 根据物品尺寸选择不同的设备中心点
|
/// 3. 确保Y轴位置在MinY和MaxY之间
|
/// </remarks>
|
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;
|
}
|
}
|
}
|