#region << 版 本 注 释 >>
|
/*----------------------------------------------------------------
|
* 命名空间:WIDESEAWCS_TaskInfoService
|
* 创建者:胡童庆
|
* 创建时间:2024/8/2 16:13:36
|
* 版本:V1.0.0
|
* 描述:
|
*
|
* ----------------------------------------------------------------
|
* 修改人:
|
* 修改时间:
|
* 版本:V1.0.1
|
* 修改说明:
|
*
|
*----------------------------------------------------------------*/
|
#endregion << 版 本 注 释 >>
|
|
using AutoMapper;
|
using Magicodes.ExporterAndImporter.Core;
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
using NetTaste;
|
using Newtonsoft.Json;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Diagnostics;
|
using System.Diagnostics.CodeAnalysis;
|
using System.Linq;
|
using System.Linq.Expressions;
|
using System.Reflection;
|
using System.Reflection.Metadata;
|
using System.Security.Policy;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Xml.Linq;
|
using WIDESEA_Common.Log;
|
using WIDESEAWCS_BasicInfoService;
|
using WIDESEAWCS_Common;
|
using WIDESEAWCS_Common.TaskEnum;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.BaseServices;
|
using WIDESEAWCS_Core.Enums;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_Core.Utilities;
|
using WIDESEAWCS_DTO.Enum;
|
using WIDESEAWCS_DTO.TaskInfo;
|
using WIDESEAWCS_IBasicInfoRepository;
|
using WIDESEAWCS_ITaskInfoRepository;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_QuartzJob.Models;
|
using WIDESEAWCS_QuartzJob.Repository;
|
using WIDESEAWCS_QuartzJob.Service;
|
|
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 IDeviceInfoRepository _deviceInfoRepository;
|
|
public TaskService(ITaskRepository BaseDal, IMapper mapper, IContainerRepository containerRepository, IContainerItemRepository containerItemRepository, IDeviceInfoRepository deviceInfoRepository) : base(BaseDal)
|
{
|
_mapper = mapper;
|
_containerRepository = containerRepository;
|
_containerItemRepository = containerItemRepository;
|
_deviceInfoRepository = deviceInfoRepository;
|
}
|
|
public Dt_Task? QueryAGantryUnExecuteTask(string gantryDeviceNo)
|
{
|
return BaseDal.QueryFirst(x => x.TaskState == (int)TaskStatusEnum.Gantry_New && x.DeviceCode == gantryDeviceNo);
|
}
|
|
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();
|
|
PlaceBlockService placeBlockService = new PlaceBlockService(containerSize, placedBlocks);
|
|
Point3D? point3D = placeBlockService.PlaceBlock(length, width, height);
|
if (point3D == null)
|
{
|
return WebResponseContent.Instance.Error("放货位置已满");
|
}
|
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 = point3D.Value.X,
|
ItemPositionY = point3D.Value.Y,
|
ItemPositionZ = point3D.Value.Z,
|
ItemStatus = (int)ItemStatusEnum.Assigned,
|
ItemName = code
|
};
|
|
int positionR = 1;
|
|
int takePositionX = 0;
|
int takePositionY = 0;
|
|
int putPositionX = 0;
|
int putPositionY = 0;
|
|
int takeContainerPositionX = 0;
|
int takeContainerPositionY = 0;
|
int takeContainerPositionZ = 0;
|
|
int putContainerPositionX = 0;
|
int putContainerPositionY = 0;
|
int putContainerPositionZ = 0;
|
|
int deviceHalfLength = 0;
|
int deviceHalfWidth = 0;
|
|
if (length > 920 && width >= 300)
|
{
|
positionR = 1;
|
if (OPositions.ZPositions.TryGetValue(takeContainer.ContainerCode, out Position? takeOPosition))
|
{
|
takeContainerPositionX = takeOPosition.PositionX;
|
takeContainerPositionY = takeOPosition.PositionY;
|
takeContainerPositionZ = takeOPosition.PositionZ;
|
}
|
|
if (OPositions.ZPositions.TryGetValue(putContainer.ContainerCode, out Position? putOPosition))
|
{
|
putContainerPositionX = putOPosition.PositionX;
|
putContainerPositionY = putOPosition.PositionY;
|
putContainerPositionZ = putOPosition.PositionZ;
|
}
|
|
deviceHalfLength = 460;
|
deviceHalfWidth = 265;
|
}
|
else
|
{
|
positionR = 0;
|
|
if (OPositions.HPositions.TryGetValue(takeContainer.ContainerCode, out Position? takeOPosition))
|
{
|
takeContainerPositionX = takeOPosition.PositionX;
|
takeContainerPositionY = takeOPosition.PositionY;
|
takeContainerPositionZ = takeOPosition.PositionZ;
|
}
|
|
if (OPositions.HPositions.TryGetValue(putContainer.ContainerCode, out Position? putOPosition))
|
{
|
putContainerPositionX = putOPosition.PositionX;
|
putContainerPositionY = putOPosition.PositionY;
|
putContainerPositionZ = putOPosition.PositionZ;
|
}
|
|
deviceHalfLength = 265;
|
deviceHalfWidth = 460;
|
}
|
|
//吸盘长530 300 间隔660 最大920 吸盘宽130
|
|
int sourceTakePositionX = 0;
|
int sourceTakePositionY = 0;
|
|
int sourcePutPositionX = 0;
|
int sourceTPutPositionY = 0;
|
|
if (length / 2 + point3D.Value.X > 1000)
|
{
|
takePositionY = 1000;
|
putPositionY = putContainerPositionY + 1000;
|
|
sourceTakePositionY = 1000;
|
sourceTPutPositionY = 1000;
|
}
|
else
|
{
|
takePositionY = takeContainerPositionY - length / 2 + deviceHalfLength;
|
putPositionY = putContainerPositionY + length / 2 + point3D.Value.X - deviceHalfLength;
|
|
sourceTakePositionY = length / 2 + point3D.Value.X + deviceHalfLength;
|
sourceTPutPositionY = length / 2 + point3D.Value.X - deviceHalfLength;
|
}
|
|
|
if (width >= 530)
|
{
|
takePositionX = takeContainerPositionX + Math.Abs( width / 2 - deviceHalfWidth);
|
putPositionX = point3D.Value.Y + putContainerPositionX + Math.Abs(width / 2 - deviceHalfWidth);
|
|
sourceTakePositionX = Math.Abs(width / 2 - deviceHalfWidth);
|
sourcePutPositionX = point3D.Value.Y + Math.Abs(width / 2 - deviceHalfWidth);
|
}
|
else
|
{
|
takePositionX = takeContainerPositionX;
|
putPositionX = point3D.Value.Y + takeContainerPositionX;
|
|
sourceTakePositionX = 0;
|
sourcePutPositionX = point3D.Value.Y;
|
}
|
|
int takePositionZ = takeContainerPositionZ - (height - (height - 10));
|
int putPositionZ = (putContainerPositionZ - (height - (height - 10))) - point3D.Value.Z;
|
|
int sourceTakePositionZ = height - (height - 10);
|
int sourcePutPositionZ = height - (height - 10) + point3D.Value.Z;
|
|
Dt_Task dt_Task = new Dt_Task()
|
{
|
TaskNum = 1,
|
PalletCode = code,
|
DeviceCode = deviceCode,
|
TaskState = (int)TaskStatusEnum.Gantry_New,
|
TaskType = 0,
|
SourceAddress = $"{takePosition}-{sourceTakePositionX}-{sourceTakePositionY}-{sourceTakePositionZ}-{positionR}",
|
TargetAddress = $"{putPosition}-{sourcePutPositionX}-{sourceTPutPositionY}-{sourcePutPositionZ}-{positionR}",
|
CurrentAddress = $"{takePosition}-{takePositionX}-{takePositionY}-{takePositionZ}-{positionR}",
|
NextAddress = $"{putPosition}-{putPositionX}-{putPositionY}-{putPositionZ}-{positionR}",
|
Grade = 0,
|
};
|
|
_containerItemRepository.AddData(dt_ContainerItem);
|
base.AddData(dt_Task);
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
}
|
}
|