From b6837f097e9cdb2645368aed4ddb03f580c331e4 Mon Sep 17 00:00:00 2001
From: z8018 <1282578289@qq.com>
Date: 星期一, 05 五月 2025 17:29:07 +0800
Subject: [PATCH] 1

---
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs |  603 ++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 450 insertions(+), 153 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
index e02f602..f0eb3c3 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs"
@@ -15,67 +15,203 @@
  *----------------------------------------------------------------*/
 #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 AutoMapper;
+using HslCommunication;
+using HslCommunication.WebSocket;
+using SqlSugar;
+using WIDESEAWCS_BasicInfoRepository;
 using WIDESEAWCS_BasicInfoService;
 using WIDESEAWCS_Common;
-using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.BaseRepository;
 using WIDESEAWCS_Core.BaseServices;
 using WIDESEAWCS_Core.Enums;
 using WIDESEAWCS_Core.Helper;
-using WIDESEAWCS_Core.Utilities;
-using WIDESEAWCS_DTO.Enum;
+using WIDESEAWCS_DTO.BasicInfo;
+using WIDESEAWCS_DTO.PlacedBlockDTO;
 using WIDESEAWCS_DTO.TaskInfo;
 using WIDESEAWCS_IBasicInfoRepository;
+using WIDESEAWCS_IBasicInfoService;
 using WIDESEAWCS_ITaskInfoRepository;
 using WIDESEAWCS_ITaskInfoService;
 using WIDESEAWCS_Model.Models;
-using WIDESEAWCS_QuartzJob.Models;
 using WIDESEAWCS_QuartzJob.Repository;
-using WIDESEAWCS_QuartzJob.Service;
+using static Dm.net.buffer.ByteArrayBuffer;
 
 namespace WIDESEAWCS_TaskInfoService
 {
     public class TaskService : ServiceBase<Dt_Task, ITaskRepository>, ITaskService
     {
+        private readonly IUnitOfWorkManage _unitOfWorkManage;
         private readonly IMapper _mapper;
         private readonly IContainerRepository _containerRepository;
         private readonly IContainerItemRepository _containerItemRepository;
-        private readonly IDeviceInfoRepository _deviceInfoRepository;
+        private readonly WebSocketServer _webSocketServer;
+        private readonly IOrderDetailsRepository _orderDetailsRepository;
+        private readonly IContainerService _containerService;
+        private readonly IOrderDetailsService _orderDetailsService;
+        private readonly IOrderrowsRepository _orderrowsRepository;
+        private readonly IOrderContainerRepository _orderContainerRepository;
 
-        public TaskService(ITaskRepository BaseDal, IMapper mapper, IContainerRepository containerRepository, IContainerItemRepository containerItemRepository, IDeviceInfoRepository deviceInfoRepository) : base(BaseDal)
+        public TaskService(ITaskRepository BaseDal, IUnitOfWorkManage unitOfWorkManage, IMapper mapper, IContainerRepository containerRepository, IContainerItemRepository containerItemRepository, WebSocketServer webSocketServer, IOrderDetailsRepository orderDetailsRepository, IContainerService containerService, IOrderDetailsService orderDetailsService, IOrderrowsRepository orderrowsRepository, IOrderContainerRepository orderContainerRepository) : base(BaseDal)
         {
+            _unitOfWorkManage = unitOfWorkManage;
             _mapper = mapper;
             _containerRepository = containerRepository;
             _containerItemRepository = containerItemRepository;
-            _deviceInfoRepository = deviceInfoRepository;
+            _webSocketServer = webSocketServer;
+            _orderDetailsRepository = orderDetailsRepository;
+            _containerService = containerService;
+            _orderDetailsService = orderDetailsService;
+            _orderrowsRepository = orderrowsRepository;
+            _orderContainerRepository = orderContainerRepository;
         }
 
         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("鏈壘鍒拌鍗曟槑缁嗕俊鎭�");
+                }
+
+                List<PlacedBlock> placedBlocks = new List<PlacedBlock>();
+
+                string putPosition = "";
+
+                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);
+
+                            if (length < 300 || width < 50)
+                            {
+                                continue;
+                            }
+
+                            OrderInfo orderInfo = _orderDetailsService.GetOrderInfoByBarcode(orderDetails[i].Orderdetails_outid);
+
+                            var (flag, taskPosition, message) = _containerService.GetPosition(orderInfo.OrderHeadId, orderInfo.OrderNo, length, width, height);
+                            if (flag && taskPosition != null)
+                            {
+                                if (string.IsNullOrEmpty(putPosition))
+                                {
+                                    putPosition = taskPosition.PutPosition;
+                                }
+
+                                if (putPosition != taskPosition.PutPosition)
+                                {
+                                    continue;
+                                }
+
+                                Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.OrderNo == orderInfo.OrderNo && x.ContainerCode == taskPosition.PutPosition);
+
+                                Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == taskPosition.PutPosition);
+                                if (putContainer == null)
+                                {
+                                    //todo
+                                    throw new Exception("鏈壘鍒版斁璐т綅缃�");
+                                }
+
+                                bool isAdd = false;
+                                if (orderContainer == null)
+                                {
+                                    orderContainer = new Dt_OrderContainer()
+                                    {
+                                        OrderId = orderInfo.OrderHeadId,
+                                        ContainerCode = putContainer.ContainerCode,
+                                        ContainerId = putContainer.Id,
+                                        OrderNo = orderInfo.OrderNo,
+                                    };
+                                    orderContainer.MaxLength = putContainer.ContainerLength;
+                                    isAdd = true;
+                                }
+
+                                if (taskPosition != null)
+                                {
+                                    Dt_ContainerItem dt_ContainerItem = new Dt_ContainerItem()
+                                    {
+                                        ContainerId = putContainer.Id,
+                                        ItemCode = orderInfo.Barcode,
+                                        ItemLength = length,
+                                        ItemWidth = width,
+                                        ItemHeight = height,
+                                        ItemPositionX = taskPosition.PositionX,
+                                        ItemPositionY = taskPosition.PositionY,
+                                        ItemPositionZ = taskPosition.PositionZ,
+                                        ItemRelaPositionX = taskPosition.PutPositionX,
+                                        ItemRelaPositionY = taskPosition.PutPositionY,
+                                        ItemRelaPositionZ = taskPosition.PutPositionZ,
+                                        ItemStatus = (int)ItemStatusEnum.Assigned,
+                                        ItemName = orderInfo.Barcode
+                                    };
+
+                                    Dt_Task dt_Task = new Dt_Task()
+                                    {
+                                        PalletCode = orderInfo.Barcode,
+                                        DeviceCode = putContainer.DeviceCode,
+                                        TaskState = (int)TaskStatusEnum.Gantry_Wait,
+                                        TaskType = 0,
+                                        SourceAddress = "",
+                                        TargetAddress = $"F06",
+                                        CurrentAddress = $"F06*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}",
+                                        NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}",
+                                        ItemInfo = $"{length}*{width}*{height}",
+                                        Grade = 0,
+                                    };
+                                    putContainer.ContainerStatus = ContainerStatusEnum.NonEmpty.ObjToInt();
+                                    _unitOfWorkManage.BeginTran();
+                                    BaseDal.AddData(dt_Task);
+                                    _containerRepository.UpdateData(putContainer);
+                                    _containerItemRepository.AddData(dt_ContainerItem);
+                                    if (isAdd)
+                                    {
+                                        _orderContainerRepository.AddData(orderContainer);
+                                    }
+                                    _unitOfWorkManage.CommitTran();
+
+                                    PlacedBlock placedBlock = new PlacedBlock(new Point3D(taskPosition.PositionX, taskPosition.PositionY, taskPosition.PositionZ), length > width ? length : width, width > length ? length : width, height);
+                                    placedBlocks.Add(placedBlock);
+
+                                    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());
+                                }
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+
+                    }
+                }
+                return WebResponseContent.Instance.OK(data: placedBlocks);
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
         }
 
         public WebResponseContent CreateTask(string takePosition, string putPosition, string deviceCode, int length, int width, int height)
@@ -88,24 +224,44 @@
                     return WebResponseContent.Instance.Error("鍙栬揣浣嶇疆涓嶅瓨鍦�");
                 }
 
+                List<Dt_Container> containers = _containerRepository.QueryData(x => x.DeviceCode == deviceCode && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt());
+
                 Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == putPosition && x.ContainerType == ContainerTypeEnum.PutContainer.ObjToInt());
                 if (putContainer == null)
                 {
                     return WebResponseContent.Instance.Error("鏀捐揣浣嶇疆涓嶅瓨鍦�");
                 }
 
+                int edge = 0;
+                if (putContainer.ContainerNo == containers.Min(x => x.ContainerNo))
+                {
+                    edge = 1;
+                }
+
                 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();
+                List<PlacedBlock> placedBlocks = containerItems.Select(x => new PlacedBlock(new Point3D(x.ItemPositionX, x.ItemPositionY, x.ItemPositionZ), x.ItemLength > x.ItemLength ? x.ItemLength : x.ItemWidth, x.ItemLength > x.ItemLength ? x.ItemWidth : x.ItemLength, x.ItemHeight)).ToList();
 
-                PlaceBlockService placeBlockService = new PlaceBlockService(containerSize, placedBlocks);
 
-                Point3D? point3D = placeBlockService.PlaceBlock(length, width, height);
-                if (point3D == null)
+                TaskPosition? taskPosition = _containerService.GetTaskPosition(length, width, height, containerSize, placedBlocks, edge);
+                if (taskPosition == null)
                 {
-                    return WebResponseContent.Instance.Error("鏀捐揣浣嶇疆宸叉弧");
+                    return WebResponseContent.Instance.Error("鏈壘鍒板悎閫傛斁缃綅缃�");
                 }
+
+                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()
@@ -115,134 +271,27 @@
                     ItemLength = length,
                     ItemWidth = width,
                     ItemHeight = height,
-                    ItemPositionX = point3D.Value.X,
-                    ItemPositionY = point3D.Value.Y,
-                    ItemPositionZ = point3D.Value.Z,
+                    ItemPositionX = taskPosition.PositionX,
+                    ItemPositionY = taskPosition.PositionY,
+                    ItemPositionZ = taskPosition.PositionZ,
+                    ItemRelaPositionX = taskPosition.PutPositionX,
+                    ItemRelaPositionY = taskPosition.PutPositionY,
+                    ItemRelaPositionZ = taskPosition.PutPositionZ,
                     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,
+                    DeviceCode = putContainer.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}",
+                    SourceAddress = "",
+                    TargetAddress = $"{takeContainer.ContainerNo}",
+                    CurrentAddress = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}",
+                    NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}",
+                    ItemInfo = $"{length}*{width}*{height}",
                     Grade = 0,
                 };
 
@@ -256,5 +305,253 @@
                 return WebResponseContent.Instance.Error(ex.Message);
             }
         }
+
+        public (bool, Dt_Task?, string) GenerateTask(OrderInfo orderInfo)
+        {
+            try
+            {
+                int length = Convert.ToInt32(orderInfo.Length);
+                int width = Convert.ToInt32(orderInfo.Width);
+                int height = Convert.ToInt32(orderInfo.Thickness);
+
+                var (flag, taskPosition, message) = _containerService.GetPosition(orderInfo.OrderHeadId, orderInfo.OrderNo, length, width, height);
+                if (flag && taskPosition != null)
+                {
+                    Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == taskPosition.PutPosition);
+                    if (putContainer == null)
+                    {
+                        return (false, null, "鏈壘鍒版斁璐т綅缃�");
+                    }
+
+                    Dt_Container? takeContainer = GetTakePosition(putContainer.DeviceCode);
+                    if (takeContainer == null)
+                    {
+                        return (false, null, "鏈壘鍒板彇璐т綅缃�");
+                    }
+
+                    Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.OrderNo == orderInfo.OrderNo && x.ContainerCode == putContainer.ContainerCode);
+
+                    bool isAdd = false;
+                    bool isUpdate = false;
+                    if (orderContainer == null)
+                    {
+                        orderContainer = new Dt_OrderContainer()
+                        {
+                            OrderId = orderInfo.OrderHeadId,
+                            ContainerCode = putContainer.ContainerCode,
+                            ContainerId = putContainer.Id,
+                            OrderNo = orderInfo.OrderNo,
+                        };
+                        orderContainer.MaxLength = putContainer.ContainerLength;
+                        isAdd = true;
+                    }
+
+                    Dt_ContainerItem dt_ContainerItem = new Dt_ContainerItem()
+                    {
+                        ContainerId = putContainer.Id,
+                        ItemCode = orderInfo.Barcode,
+                        ItemLength = length,
+                        ItemWidth = width,
+                        ItemHeight = height,
+                        ItemPositionX = taskPosition.PositionX,
+                        ItemPositionY = taskPosition.PositionY,
+                        ItemPositionZ = taskPosition.PositionZ,
+                        ItemRelaPositionX = taskPosition.PutPositionX,
+                        ItemRelaPositionY = taskPosition.PutPositionY,
+                        ItemRelaPositionZ = taskPosition.PutPositionZ,
+                        ItemStatus = (int)ItemStatusEnum.Assigned,
+                        ItemName = orderInfo.Barcode,
+                        Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}"
+                    };
+
+                    Dt_Task dt_Task = new Dt_Task()
+                    {
+                        PalletCode = orderInfo.Barcode,
+                        DeviceCode = putContainer.DeviceCode,
+                        TaskState = (int)TaskStatusEnum.Gantry_Wait,
+                        TaskType = 0,
+                        SourceAddress = "",
+                        TargetAddress = $"{takeContainer.ContainerNo}",
+                        CurrentAddress = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}",
+                        NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}",
+                        ItemInfo = $"{length}*{width}*{height}",
+                        Grade = 0,
+                    };
+                    putContainer.ContainerStatus = ContainerStatusEnum.NonEmpty.ObjToInt();
+                    _unitOfWorkManage.BeginTran();
+                    BaseDal.AddData(dt_Task);
+                    _containerRepository.UpdateData(putContainer);
+                    _containerItemRepository.AddData(dt_ContainerItem);
+                    if (isAdd)
+                    {
+                        _orderContainerRepository.AddData(orderContainer);
+                    }
+                    else if (isUpdate)
+                    {
+                        _orderContainerRepository.UpdateData(orderContainer);
+                    }
+                    _unitOfWorkManage.CommitTran();
+
+                    return (true, dt_Task, "");
+                }
+                else
+                {
+                    return (false, null, $"鏃犲彲鏀剧疆浣嶇疆,{orderInfo.Serialize()}");
+                }
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return (false, null, $"閿欒,{ex.ExceptionToString()}");
+            }
+        }
+
+        public Dt_Container? GetTakePosition(string deviceCode)
+        {
+            Dictionary<string, OrderByType> orderby = new Dictionary<string, OrderByType>() { { nameof(Dt_Container.ContainerSort), OrderByType.Asc } };
+            List<Dt_Container> containers = _containerRepository.QueryData(x => x.ContainerType == ContainerTypeEnum.TakeContainer.ObjToInt() && x.DeviceCode == deviceCode && x.ContainerEnable, orderby);
+
+            try
+            {
+                if (containers == null || containers.Count == 0)
+                {
+                    throw new Exception($"鏈壘鍒板搴旂殑鍙栬揣浣嶇疆,璁惧缂栧彿:{deviceCode}");
+                }
+
+                Dictionary<string, OrderByType> taskOrderby = new Dictionary<string, OrderByType>() { { nameof(Dt_Task.TaskNum), OrderByType.Desc } };
+                Dt_Task task = BaseDal.QueryFirst(x => x.DeviceCode == deviceCode, taskOrderby);
+                if (task != null)
+                {
+                    string? sourceCode = task.SourceAddress.Split("*").FirstOrDefault();
+                    if (!string.IsNullOrEmpty(sourceCode))
+                    {
+                        Dt_Container? container = containers.FirstOrDefault(x => x.ContainerCode == sourceCode);
+                        if (container != null)
+                        {
+                            int index = containers.IndexOf(container);
+
+                            if (index + 1 < containers.Count)
+                            {
+                                return containers[index + 1];
+                            }
+                            else
+                            {
+                                return containers.FirstOrDefault();
+                            }
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+
+            }
+            return containers.FirstOrDefault();
+        }
+
+        public WebResponseContent TaskComplete(Dt_Task task)
+        {
+            try
+            {
+                task.TaskState = TaskStatusEnum.Gantry_Completed.ObjToInt();
+                _unitOfWorkManage.BeginTran();
+                OrderDetails orderDetails = _orderDetailsRepository.QueryFirst(x => x.Orderdetails_outid == task.PalletCode);
+                if (orderDetails != null)
+                {
+                    orderDetails.Orderdetails_status = PalletingStatusEnmu.PalletingSuccess.ObjToInt();
+
+                    Orderrows orderrows = _orderrowsRepository.QueryFirst(x => x.id == orderDetails.Orderrowsid);
+                    if (orderrows != null)
+                    {
+                        orderrows.Orderrows_PalletNum = orderrows.Orderrows_PalletNum ?? 0 + 1;
+
+                        Dt_Container container = _containerRepository.QueryFirst(x => task.NextAddress.Contains(x.ContainerCode));
+
+                        _orderDetailsRepository.UpdateData(orderDetails);
+                        _orderrowsRepository.UpdateData(orderrows);
+
+                        try
+                        {
+                            List<string> containerItemCodes = _containerItemRepository.QueryData(x => x.ContainerId == container.Id).Select(x => x.ItemCode).ToList();
+
+                            List<OrderDetails> totalDetails = _orderDetailsRepository.QueryData(x => x.Orderrowsid == orderrows.id);
+                            List<OrderDetails> details = totalDetails.Where(x => x.Orderrowsid == orderrows.id && x.Orderdetails_status == PalletingStatusEnmu.PalletingSuccess.ObjToInt() && containerItemCodes.Contains(x.Orderdetails_outid)).ToList();
+
+                            int sortedNum = totalDetails.Where(x => x.Orderrowsid == orderrows.id && x.Orderdetails_status == PalletingStatusEnmu.PalletingSuccess.ObjToInt()).Count();
+                            object data = new object();
+                            if (totalDetails.Count <= sortedNum)
+                            {
+                                data = new
+                                {
+                                    stationCode = task.NextAddress.Split("*").FirstOrDefault(),
+                                    release = 1,
+                                    data = new
+                                    {
+                                        stationCode = task.NextAddress.Split("*").FirstOrDefault(),
+                                        orderTotalNum = totalDetails.Count,
+                                        sortedNum = sortedNum,
+                                        unsortedNum = totalDetails.Count - sortedNum,
+                                        stationSortedNum = details.Count,
+                                        orderId = orderrows.id,
+                                        orderData = new
+                                        {
+                                            orderCode = orderrows.Orderrows_orderid,
+                                            cusName = orderrows.Orderrows_customer,
+                                            orderName = orderrows.Orderrows_name,
+                                            batch = orderrows.Orderrows_batchid,
+                                            productName = "",
+                                        }
+                                    }
+                                };
+                            }
+                            else
+                            {
+                                data = new
+                                {
+                                    stationCode = task.NextAddress.Split("*").FirstOrDefault(),
+                                    release = 0,
+                                    data = new
+                                    {
+                                        stationCode = task.NextAddress.Split("*").FirstOrDefault(),
+                                        orderTotalNum = totalDetails.Count,
+                                        sortedNum = sortedNum,
+                                        unsortedNum = totalDetails.Count - sortedNum,
+                                        stationSortedNum = details.Count,
+                                        orderId = orderrows.id,
+                                        orderData = new
+                                        {
+                                            orderCode = orderrows.Orderrows_orderid,
+                                            cusName = orderrows.Orderrows_customer,
+                                            orderName = orderrows.Orderrows_name,
+                                            batch = orderrows.Orderrows_batchid,
+                                            productName = "",
+                                        }
+                                    }
+                                };
+                            }
+                            List<WebSocketSession> webSocketSessions2 = _webSocketServer.OnlineSessions.ToList();
+                            List<WebSocketSession> webSocketSessions = _webSocketServer.OnlineSessions.Where(x => x.Url.Contains(task.DeviceCode ?? "")).ToList();
+                            foreach (var item in webSocketSessions)
+                            {
+                                _webSocketServer.SendClientPayload(item, data.Serialize());
+                            }
+                        }
+                        catch (Exception ex)
+                        {
+
+                        }
+                    }
+                }
+
+                BaseDal.DeleteAndMoveIntoHty(task, App.User?.UserId > 0 ? OperateTypeEnum.浜哄伐瀹屾垚 : OperateTypeEnum.鑷姩瀹屾垚);
+                _unitOfWorkManage.CommitTran();
+                return WebResponseContent.Instance.OK();
+            }
+            catch (Exception ex)
+            {
+                _unitOfWorkManage.RollbackTran();
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
     }
 }

--
Gitblit v1.9.3