#region << 版 本 注 释 >>
|
/*----------------------------------------------------------------
|
* 命名空间:WIDESEAWCS_TaskInfoService
|
* 创建者:胡童庆
|
* 创建时间:2024/8/2 16:13:36
|
* 版本:V1.0.0
|
* 描述:
|
*
|
* ----------------------------------------------------------------
|
* 修改人:
|
* 修改时间:
|
* 版本:V1.0.1
|
* 修改说明:
|
*
|
*----------------------------------------------------------------*/
|
#endregion << 版 本 注 释 >>
|
|
using AutoMapper;
|
using HslCommunication.WebSocket;
|
using SqlSugar;
|
using WIDESEAWCS_BasicInfoRepository;
|
using WIDESEAWCS_BasicInfoService;
|
using WIDESEAWCS_Common;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.BaseServices;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_DTO.TaskInfo;
|
using WIDESEAWCS_IBasicInfoRepository;
|
using WIDESEAWCS_ITaskInfoRepository;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_QuartzJob.Repository;
|
|
namespace WIDESEAWCS_TaskInfoService
|
{
|
public class TaskService : ServiceBase<Dt_Task, ITaskRepository>, ITaskService
|
{
|
private readonly IMapper _mapper;
|
private readonly IContainerRepository _containerRepository;
|
private readonly IContainerItemRepository _containerItemRepository;
|
private readonly WebSocketServer _webSocketServer;
|
private readonly IOrderDetailsRepository _orderDetailsRepository;
|
|
public TaskService(ITaskRepository BaseDal, IMapper mapper, IContainerRepository containerRepository, IContainerItemRepository containerItemRepository, WebSocketServer webSocketServer, IOrderDetailsRepository orderDetailsRepository) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_containerRepository = containerRepository;
|
_containerItemRepository = containerItemRepository;
|
_webSocketServer = webSocketServer;
|
_orderDetailsRepository = orderDetailsRepository;
|
}
|
|
public Dt_Task? QueryAGantryUnExecuteTask(string gantryDeviceNo)
|
{
|
return BaseDal.QueryFirst(x => x.TaskState == (int)TaskStatusEnum.Gantry_New && x.DeviceCode == gantryDeviceNo);
|
}
|
|
public WebResponseContent PlaceBlockTest(int orderRowId)
|
{
|
try
|
{
|
List<OrderDetails> orderDetails = _orderDetailsRepository.QueryData(x => x.Orderrowsid == orderRowId);
|
if (orderDetails == null || orderDetails.Count == 0)
|
{
|
return WebResponseContent.Instance.Error("未找到订单明细信息");
|
}
|
|
Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt());
|
if (putContainer == null)
|
{
|
return WebResponseContent.Instance.Error("放货位置不存在");
|
}
|
|
ContainerSize containerSize = new ContainerSize(1500, putContainer.ContainerWidth, putContainer.ContainerHeight);
|
List<PlacedBlock> placedBlocks = new List<PlacedBlock>();
|
|
for (int i = 0; i < orderDetails.Count; i++)
|
{
|
try
|
{
|
lock (placedBlocks)
|
{
|
int length = Convert.ToInt32(orderDetails[i].Orderdetails_length);
|
int width = Convert.ToInt32(orderDetails[i].Orderdetails_width);
|
int height = Convert.ToInt32(orderDetails[i].Orderdetails_thickness);
|
|
TaskPosition taskPosition = new TaskPosition();
|
taskPosition = GetTakePutPosition(length, width, height, containerSize, placedBlocks);
|
|
PlacedBlock placedBlock = new PlacedBlock(new Point3D(taskPosition.PositionX, taskPosition.PositionY, taskPosition.PositionZ), length, width, height);
|
placedBlocks.Add(placedBlock);
|
|
object obj = new
|
{
|
x = taskPosition.PutCenterPositionX - containerSize.Length / 2,
|
y = taskPosition.PutCenterPositionY - containerSize.Width / 2,
|
z = taskPosition.PutCenterPositionZ,
|
length,
|
width,
|
height,
|
};
|
|
_webSocketServer.PublishAllClientPayload(obj.Serialize());
|
|
Thread.Sleep(100);
|
}
|
}
|
catch (Exception ex)
|
{
|
|
}
|
}
|
return WebResponseContent.Instance.OK(data: placedBlocks);
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public TaskPosition GetTakePutPosition(int length, int width, int height, ContainerSize containerSize, List<PlacedBlock> placedBlocks)
|
{
|
try
|
{
|
PlaceBlockService placeBlockService = new PlaceBlockService(containerSize, placedBlocks);
|
|
Point3D? point3D = placeBlockService.PlaceBlock(length, width, height);
|
if (point3D == null)
|
{
|
throw new Exception("放货位置已满");
|
}
|
|
//放货位置板材中心点
|
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 >= 300)
|
{
|
//
|
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
|
{
|
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*/;
|
}
|
|
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 WebResponseContent CreateTask(string takePosition, string putPosition, string deviceCode, int length, int width, int height)
|
{
|
try
|
{
|
Dt_Container takeContainer = _containerRepository.QueryFirst(x => x.ContainerCode == takePosition && x.ContainerType == ContainerTypeEnum.TakeContainer.ObjToInt());
|
if (takeContainer == null)
|
{
|
return WebResponseContent.Instance.Error("取货位置不存在");
|
}
|
|
Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == putPosition && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt());
|
if (putContainer == null)
|
{
|
return WebResponseContent.Instance.Error("放货位置不存在");
|
}
|
|
ContainerSize containerSize = new ContainerSize(putContainer.ContainerLength, putContainer.ContainerWidth, putContainer.ContainerHeight);
|
List<Dt_ContainerItem> containerItems = _containerItemRepository.QueryData(x => x.ContainerId == putContainer.Id);
|
|
List<PlacedBlock> placedBlocks = containerItems.Select(x => new PlacedBlock(new Point3D(x.ItemPositionX, x.ItemPositionY, x.ItemPositionZ), x.ItemLength, x.ItemWidth, x.ItemHeight)).ToList();
|
|
|
TaskPosition taskPosition = GetTakePutPosition(length, width, height, containerSize, placedBlocks);
|
|
object obj = new
|
{
|
x = taskPosition.PutCenterPositionX - putContainer.ContainerLength / 2,
|
y = taskPosition.PutCenterPositionY - putContainer.ContainerWidth / 2,
|
z = taskPosition.PutCenterPositionZ,
|
length,
|
width,
|
height,
|
};
|
|
_webSocketServer.PublishAllClientPayload(obj.Serialize());
|
|
string code = DateTime.Now.ToString("yyyyMMddHHmmss");
|
|
Dt_ContainerItem dt_ContainerItem = new Dt_ContainerItem()
|
{
|
ContainerId = putContainer.Id,
|
ItemCode = code,
|
ItemLength = length,
|
ItemWidth = width,
|
ItemHeight = height,
|
ItemPositionX = taskPosition.PutPositionX,
|
ItemPositionY = taskPosition.PutPositionY,
|
ItemPositionZ = taskPosition.PutPositionZ,
|
ItemStatus = (int)ItemStatusEnum.Assigned,
|
ItemName = code
|
};
|
|
Dt_Task dt_Task = new Dt_Task()
|
{
|
TaskNum = 1,
|
PalletCode = code,
|
DeviceCode = deviceCode,
|
TaskState = (int)TaskStatusEnum.Gantry_New,
|
TaskType = 0,
|
SourceAddress = $"{takePosition}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}",
|
TargetAddress = $"{putPosition}*{taskPosition.PutPositionX}*{taskPosition.PutPositionX}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}",
|
CurrentAddress = $"{takePosition}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}",
|
NextAddress = $"{putPosition}*{taskPosition.PutPositionX}*{taskPosition.PutPositionX}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}",
|
Grade = 0,
|
};
|
|
_containerItemRepository.AddData(dt_ContainerItem);
|
base.AddData(dt_Task);
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
}
|
}
|