#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, 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 = _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 placedBlocks = new List(); 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 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 containerItems = _containerItemRepository.QueryData(x => x.ContainerId == putContainer.Id); List 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); } } } }