using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using AutoMapper; using WIDESEAWCS_BasicInfoService; using WIDESEAWCS_Common; using WIDESEAWCS_Core; using WIDESEAWCS_Core.BaseRepository; using WIDESEAWCS_Core.BaseServices; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO.BasicInfo; using WIDESEAWCS_DTO.PlacedBlockDTO; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_IBasicInfoRepository; using WIDESEAWCS_IBasicInfoService; using WIDESEAWCS_Model.Models; namespace WIDESEAWCS_BasicInfoService { public class ContainerService : ServiceBase, IContainerService { private readonly IMapper _mapper; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IContainerItemRepository _containerItemRepository; private readonly IOrderContainerRepository _orderContainerRepository; public ContainerService(IContainerRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IContainerItemRepository containerItemRepository, IOrderContainerRepository orderContainerRepository) : base(BaseDal) { _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _containerItemRepository = containerItemRepository; _orderContainerRepository = orderContainerRepository; } public SuctionInfo GetPlacementResult(Block block, List blocks) { ContainerPlacer containerPlacer = new ContainerPlacer(); return containerPlacer.CalculatePlacement(block, blocks); } /// /// 获取放置位置 /// /// /// /// /// /// /// 边 /// /// public TaskPosition? GetTaskPosition(int length, int width, int height, ContainerSize containerSize, List placedBlocks, int edge) { try { PlaceBlockService placeBlockService = new PlaceBlockService(containerSize, placedBlocks); TaskPosition? taskPosition = placeBlockService.PlaceBlock(length, width, height, edge); return taskPosition; } catch (Exception ex) { throw new Exception(ex.Message); } } public (bool, TaskPosition?, string) GetPosition(int orderId, string orderNo, int length, int width, int height) { TaskPosition? taskPosition = GetPositionByOrder(orderId, orderNo, length, width, height); if (taskPosition != null) { return (true, taskPosition, ""); } taskPosition = GetPosition(length, width, height); if (taskPosition != null) { return (true, taskPosition, ""); } return (true, taskPosition, "10001"); } public TaskPosition? GetPosition(int length, int width, int height) { List containers = Db.Queryable().Where(x => x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Includes(x => x.Items).ToList(); Dt_Container? container = containers.OrderBy(x => x.ContainerSort).FirstOrDefault(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt() && x.ContainerEnable); List placedBlocks = new List(); if (container != null && (containers.Any(x => (x.Items.Any(v => v.ItemLength > 1600 || v.ItemWidth > 1600)) && x.DeviceCode == container.DeviceCode) || containers.Where(x => x.ContainerStatus == ContainerStatusEnum.Empty.ObjToInt() && x.ContainerEnable && x.DeviceCode == container.DeviceCode).Count() > 1 || length > 1600 || width > 1600)) { int edge = 0; if (container.ContainerNo == containers.Where(x => x.DeviceCode == container.DeviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Min(x => x.ContainerNo)) { edge = 1; } ContainerSize containerSize = new ContainerSize(container.ContainerLength, container.ContainerWidth, container.ContainerHeight); TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks, edge); if (taskPosition != null) { taskPosition.PutPosition = container.ContainerCode; return taskPosition; } } return null; } public TaskPosition? GetPositionByOrder(int orderId, string orderNo, int length, int width, int height) { List orderContainers = Db.Queryable().Where(it => it.OrderNo == orderNo && it.OrderId == orderId).ToList(); if (orderContainers != null && orderContainers.Count > 0) { List dt_Containers = Db.Queryable().ToList(); List containers = dt_Containers.Where(it => orderContainers.Any(x => x.ContainerId == it.Id && x.ContainerCode == it.ContainerCode) && it.ContainerEnable && it.ContainerStatus != ContainerStatusEnum.ReadyRelease.ObjToInt()).ToList().OrderBy(x => x.ContainerSort).ToList(); for (int i = 0; i < containers.Count; i++) { containers[i].Items = Db.Queryable().Where(x => x.ContainerId == containers[i].Id).ToList(); } foreach (var container in containers) { List placedBlocks = new List(); foreach (var item in container.Items) { int tempLength = item.ItemLength; int tempWidth = item.ItemWidth; if (item.ItemLength < item.ItemWidth) { tempLength = item.ItemWidth; tempWidth = item.ItemLength; } Point3D point3D = new Point3D(item.ItemPositionX, item.ItemPositionY, item.ItemPositionZ); placedBlocks.Add(new PlacedBlock(point3D, tempLength, tempWidth, item.ItemHeight)); } Dt_OrderContainer? orderContainer = orderContainers.FirstOrDefault(x => x.ContainerId == x.Id && x.ContainerCode == x.ContainerCode); int edge = 0; if (container.ContainerNo == dt_Containers.Where(x => x.DeviceCode == container.DeviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt()).Min(x => x.ContainerNo)) { edge = 1; } ContainerSize containerSize = new ContainerSize(container.ContainerLength, container.ContainerWidth, container.ContainerHeight); TaskPosition? taskPosition = GetTaskPosition(length, width, height, containerSize, placedBlocks, edge); if (taskPosition != null) { taskPosition.PutPosition = container.ContainerCode; return taskPosition; } //else //{ // if (LightStatusStorage.LightStatusDic.ContainsKey(container.ContainerCode))//LightStatusEnum // { // LightStatusStorage.LightStatusDic[container.ContainerCode] = LightStatusEnum.ReadyRelease; // if (container.Items.Count > 10) // { // container.ContainerStatus = ContainerStatusEnum.ReadyRelease.ObjToInt(); // BaseDal.UpdateData(container); // } // } //} } } return null; } public WebResponseContent ReleaseContainer(int[] keys) { try { List containers = Db.Queryable().Where(x => keys.Contains(x.Id)).Includes(x => x.Items).ToList(); List containerItems = new List(); List orderContainers = Db.Queryable().Where(x => containers.Select(x => x.Id).ToList().Contains(x.ContainerId)).ToList(); for (int i = 0; i < containers.Count; i++) { containers[i].ContainerStatus = ContainerStatusEnum.Empty.ObjToInt(); containerItems.AddRange(containers[i].Items); } _unitOfWorkManage.BeginTran(); _containerItemRepository.DeleteAndMoveIntoHty(containerItems, App.User?.UserId > 0 ? WIDESEAWCS_Core.Enums.OperateTypeEnum.人工删除 : WIDESEAWCS_Core.Enums.OperateTypeEnum.自动删除); _orderContainerRepository.DeleteAndMoveIntoHty(orderContainers, App.User?.UserId > 0 ? WIDESEAWCS_Core.Enums.OperateTypeEnum.人工删除 : WIDESEAWCS_Core.Enums.OperateTypeEnum.自动删除); Db.Updateable(containers).ExecuteCommand(); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } } }