From e46aa927d231af83724683c7286d9db503e24cf7 Mon Sep 17 00:00:00 2001 From: z8018 <1282578289@qq.com> Date: 星期二, 10 六月 2025 11:46:20 +0800 Subject: [PATCH] 1 --- 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs | 1596 ++++++++++++++++++++++++++++++---------------------------- 1 files changed, 831 insertions(+), 765 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 5ce308e..9684e51 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,852 +15,918 @@ *----------------------------------------------------------------*/ #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_Comm.Http; -using WIDESEA_Common.Log; -using WIDESEAWCS_Common.TaskEnum; +using AutoMapper; +using HslCommunication; +using HslCommunication.WebSocket; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; +using SqlSugar; +using WIDESEAWCS_BasicInfoRepository; +using WIDESEAWCS_BasicInfoService; +using WIDESEAWCS_Common; using WIDESEAWCS_Core; +using WIDESEAWCS_Core.BaseRepository; using WIDESEAWCS_Core.BaseServices; using WIDESEAWCS_Core.Enums; -using WIDESEAWCS_Core.Utilities; -using WIDESEAWCS_DTO.Enum; +using WIDESEAWCS_Core.Helper; +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.Service; -using static Microsoft.IO.RecyclableMemoryStreamManager; +using WIDESEAWCS_QuartzJob.Repository; +using static Dm.net.buffer.ByteArrayBuffer; namespace WIDESEAWCS_TaskInfoService { + /// <summary> + /// 浠诲姟鏈嶅姟绫伙紝鎻愪緵浠诲姟鐩稿叧鐨勪笟鍔¢�昏緫鎿嶄綔 + /// </summary> + /// <remarks> + /// 涓昏鍔熻兘鍖呮嫭锛� <br/> + /// 1. 鏌ヨ闂ㄦ灦璁惧鏈墽琛屼换鍔� <br/> + /// 2. 鎵ц璁㈠崟鍧楁斁缃祴璇� <br/> + /// 3. 鍒涘缓鍜岀鐞嗕换鍔� <br/> + /// 4. 鐢熸垚鍜岄噸鏂扮敓鎴愪换鍔� <br/> + /// 5. 澶勭悊寮傚父浠诲姟 <br/> + /// 6. 浠诲姟瀹屾垚澶勭悊 <br/> + /// 渚濊禆浠撳偍灞傝繘琛屾暟鎹闂紝閫氳繃宸ヤ綔鍗曞厓绠$悊浜嬪姟 <br/> + /// 浣跨敤WebSocket杩涜瀹炴椂閫氱煡锛屽苟鍖呭惈瀹屾暣鐨勫紓甯稿鐞嗘満鍒� + /// </remarks> public class TaskService : ServiceBase<Dt_Task, ITaskRepository>, ITaskService { - private readonly IRouterService _routerService; - private readonly ITaskExecuteDetailService _taskExecuteDetailService; - private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository; - private readonly ITask_HtyService _task_HtyService; + /// <summary> + /// 宸ヤ綔鍗曞厓绠$悊鎺ュ彛瀹炰緥锛岀敤浜庣鐞嗘暟鎹簱浜嬪姟鍜屽伐浣滃崟鍏� + /// </summary> + private readonly IUnitOfWorkManage _unitOfWorkManage; + + /// <summary> + /// 鐢ㄤ簬瀵硅薄鏄犲皠鐨勬槧灏勫櫒瀹炰緥 + /// </summary> private readonly IMapper _mapper; + /// <summary> + /// 瀹瑰櫒浠撳偍鎺ュ彛瀹炰緥锛岀敤浜庡鍣ㄧ浉鍏虫暟鎹搷浣� + /// </summary> + private readonly IContainerRepository _containerRepository; - private Dictionary<string, OrderByType> _taskOrderBy = new() - { - {nameof(Dt_Task.Grade),OrderByType.Desc }, - {nameof(Dt_Task.CreateDate),OrderByType.Asc}, - }; + /// <summary> + /// 瀹瑰櫒鐗╁搧浠撳偍鎺ュ彛瀹炰緥锛堝彧璇伙級 + /// </summary> + private readonly IContainerItemRepository _containerItemRepository; - public Dictionary<string, OrderByType> TaskOrderBy { get { return _taskOrderBy; } set { _taskOrderBy = value; } } + /// <summary> + /// WebSocket鏈嶅姟鍣ㄥ疄渚嬶紝鐢ㄤ簬澶勭悊WebSocket杩炴帴 + /// </summary> + private readonly WebSocketServer _webSocketServer; - public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList(); + /// <summary> + /// 璁㈠崟璇︽儏浠撳偍鎺ュ彛瀹炰緥锛堝彧璇伙級 + /// </summary> + private readonly IOrderDetailsRepository _orderDetailsRepository; - public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList(); + /// <summary> + /// 瀹瑰櫒鏈嶅姟鎺ュ彛瀹炰緥锛岀敤浜庣鐞嗕緷璧栨敞鍏ュ鍣ㄧ浉鍏虫搷浣� + /// </summary> + private readonly IContainerService _containerService; - public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, ITask_HtyService task_HtyService) : base(BaseDal) + /// <summary> + /// 璁㈠崟鏄庣粏鏈嶅姟鎺ュ彛 + /// </summary> + private readonly IOrderDetailsService _orderDetailsService; + + /// <summary> + /// 璁㈠崟琛屼粨鍌ㄦ帴鍙e疄渚嬶紝鐢ㄤ簬鎿嶄綔璁㈠崟琛屾暟鎹� + /// </summary> + private readonly IOrderrowsRepository _orderrowsRepository; + + /// <summary> + /// 璁㈠崟瀹瑰櫒浠撳偍鎺ュ彛瀹炰緥锛岀敤浜庢搷浣滆鍗曞鍣ㄧ浉鍏虫暟鎹� + /// </summary> + private readonly IOrderContainerRepository _orderContainerRepository; + + 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) { - _routerService = routerService; - _taskExecuteDetailService = taskExecuteDetailService; - _taskExecuteDetailRepository = taskExecuteDetailRepository; - _task_HtyService = task_HtyService; + _unitOfWorkManage = unitOfWorkManage; _mapper = mapper; + _containerRepository = containerRepository; + _containerItemRepository = containerItemRepository; + _webSocketServer = webSocketServer; + _orderDetailsRepository = orderDetailsRepository; + _containerService = containerService; + _orderDetailsService = orderDetailsService; + _orderrowsRepository = orderrowsRepository; + _orderContainerRepository = orderContainerRepository; } /// <summary> - /// 鎺ユ敹WMS浠诲姟淇℃伅 + /// 鏌ヨ鎸囧畾闂ㄦ灦璁惧鏈墽琛岀殑浠诲姟 /// </summary> - /// <param name="taskDTOs">WMS浠诲姟瀵硅薄闆嗗悎</param> - /// <returns>杩斿洖澶勭悊缁撴灉</returns> - public WebResponseContent ReceiveWMSTask(Dt_Task taskDTOs) + /// <param name="gantryDeviceNo">闂ㄦ灦璁惧缂栧彿</param> + /// <returns>鏈墽琛岀殑浠诲姟鏁版嵁锛岃嫢涓嶅瓨鍦ㄥ垯杩斿洖null</returns> + public Dt_Task? QueryAGantryUnExecuteTask(string gantryDeviceNo) { - WebResponseContent content = new WebResponseContent(); + return BaseDal.QueryFirst(x => x.TaskState == (int)TaskStatusEnum.Gantry_New && x.DeviceCode == gantryDeviceNo); + } + + /// <summary> + /// 鎵ц璁㈠崟鍧楁斁缃祴璇曪紝鏍规嵁璁㈠崟琛孖D鑾峰彇璁㈠崟鏄庣粏骞惰绠楁斁缃綅缃� + /// </summary> + /// <param name="orderRowId">璁㈠崟琛孖D</param> + /// <returns>鍖呭惈鏀剧疆鍧椾俊鎭殑Web鍝嶅簲鍐呭銆傛垚鍔熸椂杩斿洖鏀剧疆鍧楀垪琛紝澶辫触鏃惰繑鍥為敊璇俊鎭�</returns> + /// <remarks> + /// 1. 閫氳繃璁㈠崟琛孖D鏌ヨ璁㈠崟鏄庣粏鏁版嵁 <br/> + /// 2. 瀵规瘡涓湁鏁堣鍗曟槑缁嗚绠楀悎閫傜殑鏀剧疆浣嶇疆 <br/> + /// 3. 鍒涘缓瀹瑰櫒椤瑰拰浠诲姟璁板綍 <br/> + /// 4. 閫氳繃WebSocket鍙戝竷鏀剧疆浣嶇疆淇℃伅 <br/> + /// 5. 杩斿洖鎵�鏈夋垚鍔熸斁缃殑鍧椾俊鎭� + /// </remarks> + public WebResponseContent PlaceBlockTest(int orderRowId) + { try { - - BaseDal.AddData(taskDTOs); - content = WebResponseContent.Instance.OK("鎴愬姛"); - } - catch (Exception ex) - { - content = WebResponseContent.Instance.Error($"鐢熸垚浠诲姟澶辫触,閿欒淇℃伅:{ex.Message}"); - } - finally - { - WriteLog.GetLog("鐢熸垚浠诲姟").Write(JsonConvert.SerializeObject(content), "鐢熸垚浠诲姟"); - } - return content; - } - - /// <summary> - /// 鏌ユ壘璇ョ珯鍙版槸鍚︽湁浠诲姟 - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns></returns> - public List<string> QueryConveyorLineTaskSourceAddress() - { - return BaseDal.QueryData().Select(task => task.SourceAddress).ToList(); - } - - /// <summary> - /// 淇敼浠诲姟锛屾坊鍔犵洰鏍囧湴鍧� - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns></returns> - public WebResponseContent UpdateTargetAddress(int TaskId,string TargetAddress) - { - - WebResponseContent content = new WebResponseContent(); - try - { - Dt_Task dt_Task = BaseDal.QueryFirst(x => x.TaskId == TaskId); - dt_Task.TargetAddress = TargetAddress; - dt_Task.NextAddress = TargetAddress; - BaseDal.UpdateData(dt_Task); - content = WebResponseContent.Instance.OK("鎴愬姛"); - } - catch (Exception ex) - { - content = WebResponseContent.Instance.Error($"浠诲姟鎺ユ敹閿欒,閿欒淇℃伅:{ex.Message}"); - } - finally - { - WriteLog.GetLog("鎺ユ敹浠诲姟").Write(JsonConvert.SerializeObject(content), "鎺ユ敹浠诲姟"); - } - return content; - } - - /// <summary> - /// 鏌ユ壘鏄惁鏈変换鍔″彲浠ユ斁鍦ㄨ浣嶇疆 - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns></returns> - public Dt_Task QueryConveyorLineTaskRoadway(int agvarea) - { - return BaseDal.QueryFirst(x => x.Roadway == agvarea.ToString() && x.MaterialType == (int)AgvStationEnum.BoardUnload && x.TargetAddress ==""); - - } - - - public bool QueryConveyorLinetaeersuadd(string taeersuadd) - { - Dt_Task dt_= BaseDal.QueryFirst(x => x.SourceAddress == taeersuadd || x.TargetAddress == taeersuadd); - if(dt_==null) return true; - else return false; - - } - /// <summary> - /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鏌ヨ杈撻�佺嚎鏈墽琛岀殑浠诲姟 - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns></returns> - public Dt_Task QueryConveyorLineTask(string deviceNo, string currentAddress) - { - return BaseDal.QueryFirst(x => (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.InNew || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.SC_OutFinish) && x.CurrentAddress == currentAddress, TaskOrderBy); - } - - /// <summary> - /// 鏍规嵁浠诲姟鍙枫�佷笅涓�鍦板潃鏌ヨ杈撻�佺嚎鎵ц涓殑浠诲姟 - /// </summary> - /// <param name="taskNum">浠诲姟鍙�</param> - /// <param name="nextAddress">涓嬩竴鍦板潃</param> - /// <returns></returns> - public Dt_Task QueryExecutingConveyorLineTask(int taskNum, string nextAddress) - { - return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.NextAddress == nextAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting), TaskOrderBy); - } - - /// <summary> - /// 鏍规嵁浠诲姟鍙枫�佸綋鍓嶅湴鍧�鏌ヨ杈撻�佺嚎瀹屾垚鐨勪换鍔� - /// </summary> - /// <param name="taskNum">浠诲姟鍙�</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns></returns> - public Dt_Task QueryCompletedConveyorLineTask(int taskNum, string currentAddress) - { - return BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress && (x.TaskState == (int)TaskInStatusEnum.Line_InFinish || x.TaskState == (int)TaskOutStatusEnum.Line_OutFinish), TaskOrderBy); - } - - /// <summary> - /// 鏍规嵁璁惧缂栧彿銆佷换鍔$被鍨嬪垎缁�(鍙��)鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鏂板鐨勪换鍔� - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="taskTypeGroup">浠诲姟绫诲瀷鍒嗙粍(鍙��)</param> - /// <returns></returns> - public Dt_Task? QuertStackerCraneTask(string deviceNo, TaskTypeGroup? taskTypeGroup = null) - { - if(taskTypeGroup == null) - return BaseDal.QueryFirst(x => x.Roadway == deviceNo && (TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish || TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew), TaskOrderBy); - if(taskTypeGroup.Value == TaskTypeGroup.InboundGroup) - return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy); - if(taskTypeGroup.Value == TaskTypeGroup.OutbondGroup) - return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); - return null; - } - - /// <summary> - /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鏂板鐨勪换鍔� - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns> - public Dt_Task QueryStackerCraneTask(string deviceNo, string currentAddress = "") - { - return BaseDal.QueryFirst(x => x.TaskState == (int)TaskOutStatusEnum.OutNew && (deviceNo == "AGV01" ? x.Roadway == AgvareaEnum.AreaOne.ToString() : x.Roadway != AgvareaEnum.AreaOne.ToString()),TaskOrderBy); - } - - - public Dt_Task IngStackerCraneTask(string deviceNo) - { - //string deviceNot = deviceNo == "SC01" ? "1" : "2"; - return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.TaskState == (int)TaskInStatusEnum.SC_InExecuting); - } - - public Dt_Task IngStackerCraneTask2(string deviceNo) - { - //string deviceNot = deviceNo == "SC01" ? "1" : "2"; - try - { - return BaseDal.QueryFirst(x => x.Roadway == deviceNo && x.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting); - } - catch (Exception ex) - { - - throw; - } - } - - /// <summary> - /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍏ュ簱绫诲瀷鐨勬柊澧炵殑浠诲姟 - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns> - public Dt_Task QueryStackerCraneInTask(string deviceNo, string currentAddress = "") - { - if (string.IsNullOrEmpty(currentAddress)) - return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish, TaskOrderBy); - else - return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskInboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskInStatusEnum.Line_InFinish && x.CurrentAddress == currentAddress, TaskOrderBy); - } - - /// <summary> - /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍑哄簱绫诲瀷鐨勬柊澧炵殑浠诲姟 - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄锛屽彲鑳戒负null</returns> - public Dt_Task QueryStackerCraneOutTask(string deviceNo, string currentAddress = "") - { - if (string.IsNullOrEmpty(currentAddress)) - return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew, TaskOrderBy); - else - return BaseDal.QueryFirst(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && x.CurrentAddress == currentAddress, TaskOrderBy); - } - - /// <summary> - /// 鏍规嵁璁惧缂栧彿銆佸綋鍓嶅湴鍧�鎸夌収浼樺厛绾т互鍙婂垱寤烘椂闂存帓搴忔煡璇换鍔℃睜鍑哄簱绫诲瀷鐨勬柊澧炵殑浠诲姟 - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄闆嗗悎锛屽彲鑳戒负null</returns> - public List<Dt_Task> QueryStackerCraneOutTasks(string deviceNo, List<string> outStationCodes) - { - return BaseDal.QueryData(x => x.Roadway == deviceNo && TaskOutboundTypes.Contains(x.TaskType) && x.TaskState == (int)TaskOutStatusEnum.OutNew && outStationCodes.Contains(x.CurrentAddress), TaskOrderBy); - } - - /// <summary> - /// 鏍规嵁鍑哄簱璐т綅鏌ヨ鏄惁鏈夊綋鍓嶆祬璐т綅浠诲姟 - /// </summary> - /// <param name="deviceNo">璁惧缂栧彿</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns>杩斿洖浠诲姟瀹炰綋瀵硅薄闆嗗悎锛屽彲鑳戒负null</returns> - public List<Dt_Task> QueryStationIsOccupiedOutTasks(string deviceNo, string SourceAddress) - { - return BaseDal.QueryData(x => x.Roadway == deviceNo && SourceAddress.Contains(x.SourceAddress), TaskOrderBy); - } - - /// <summary> - /// 鏇存柊浠诲姟寮傚父淇℃伅鏄剧ず - /// </summary> - /// <param name="taskNum">浠诲姟鍙�</param> - /// <param name="message">寮傚父淇℃伅</param> - public WebResponseContent UpdateTaskExceptionMessage(int taskNum, string message) - { - WebResponseContent content = new WebResponseContent(); - try - { - Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); - if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); - if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) + List<OrderDetails> orderDetails = _orderDetailsRepository.QueryData(x => x.Orderrowsid == orderRowId); + if (orderDetails == null || orderDetails.Count == 0) { - task.TaskState = (int)TaskOutStatusEnum.OutPending; + return WebResponseContent.Instance.Error("鏈壘鍒拌鍗曟槑缁嗕俊鎭�"); } - else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) + + List<PlacedBlock> placedBlocks = new List<PlacedBlock>(); + + string putPosition = ""; + + for (int i = 0; i < orderDetails.Count; i++) { - task.TaskState = (int)TaskInStatusEnum.InPending; - } - task.ExceptionMessage = message; - task.ModifyDate = DateTime.Now; - BaseDal.UpdateData(task); - - _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, task.ExceptionMessage); - - content = WebResponseContent.Instance.OK(); - } - catch (Exception ex) - { - content = WebResponseContent.Instance.Error(ex.Message); - } - return content; - } - - /// <summary> - /// 鏇存柊浠诲姟鐘舵�佷俊鎭紝骞跺悓姝ヨ嚦WMS - /// </summary> - /// <param name="taskNum">浠诲姟鍙�</param> - /// <param name="status">浠诲姟鐘舵��</param> - public void UpdateTaskStatus(int taskNum, int status) - { - Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); - if (task == null) return; - task.TaskState = status; - task.ModifyDate = DateTime.Now; - BaseDal.UpdateData(task); - } - - /// <summary> - /// 灏嗕换鍔$姸鎬佷慨鏀逛负涓嬩竴涓姸鎬� - /// </summary> - /// <param name="taskNum">浠诲姟鍙�</param> - public WebResponseContent UpdateTaskStatusToNext(int taskNum) - { - WebResponseContent content = new WebResponseContent(); - try - { - Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); - if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); - return UpdateTaskStatusToNext(task); - } - catch (Exception ex) - { - content = WebResponseContent.Instance.Error(ex.Message); - } - return content; - } - - /// <summary> - /// 灏嗕换鍔$姸鎬佷慨鏀逛负涓嬩竴涓姸鎬� - /// </summary> - /// <param name="task">浠诲姟瀹炰綋瀵硅薄</param> - /// <returns></returns> - public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task) - { - WebResponseContent content = new WebResponseContent(); - try - { - int oldState = task.TaskState; - if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound) - { - if (task.TaskState >= (int)TaskOutStatusEnum.OutFinish) + try { - return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�"); - } - - int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskOutStatusEnum>(); - - task.TaskState = nextStatus; - if (task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting) - { - task.Dispatchertime = DateTime.Now; - } - } - else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound) - { - if (task.TaskState >= (int)TaskInStatusEnum.InFinish) - { - return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�"); - } - - int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>(); - task.TaskState = nextStatus; - if (task.TaskState == (int)TaskInStatusEnum.SC_InExecuting) - { - task.Dispatchertime = DateTime.Now; - } - if (task.TaskState == (int)TaskRelocationTypeEnum.Relocation) - { - Random random = new Random(); - task.CurrentAddress = task.NextAddress; - task.NextAddress = $"{random.Next(1, 100).ToString().PadLeft(3, '0')}-{random.Next(1, 100).ToString().PadLeft(3, '0')}-{random.Next(1, 100).ToString().PadLeft(3, '0')}"; - task.TargetAddress = task.NextAddress; - } - } - else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound) - { - if (task.TaskState <= (int)TaskRelocationStatusEnum.SC_RelocationFinish) - { - - return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�"); - } - - int nextStatus = (int)TaskRelocationStatusEnum.SC_RelocationExecuting; - task.TaskState = nextStatus; - if (task.TaskState == (int)TaskRelocationStatusEnum.SC_RelocationExecuting) - { - task.Dispatchertime = DateTime.Now; - } - } - else - { - throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�"); - } - - if (task.TaskState <= 0) - { - return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙烦杞埌涓嬩竴姝�,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�"); - } - - - task.ModifyDate = DateTime.Now; - task.Modifier = "System"; - BaseDal.UpdateData(task); - - _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, App.User.UserId > 0 ? $"浜哄伐鎵嬪姩灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戣烦杞埌銆恵task.TaskState}銆�" : $"绯荤粺鑷姩娴佺▼锛屼换鍔$姸鎬佷粠銆恵oldState}銆戣浆鍒般�恵task.TaskState}銆�"); - - content = WebResponseContent.Instance.OK(); - } - catch (Exception ex) - { - content = WebResponseContent.Instance.Error(ex.Message); - } - return content; - } - - /// <summary> - /// 鏍规嵁浠诲姟鍙枫�佸綋鍓嶅湴鍧�鏇存柊浠诲姟浣嶇疆淇℃伅 - /// </summary> - /// <param name="taskNum">浠诲姟鍙�</param> - /// <param name="currentAddress">褰撳墠鍦板潃</param> - /// <returns></returns> - public Dt_Task? UpdatePosition(int taskNum, string currentAddress) - { - try - { - Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress); - if (task == null) throw new Exception($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); - - string oldCurrentPos = task.CurrentAddress; - string oldNextPos = task.NextAddress; - - List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress); - if (!routers.Any()) throw new Exception($"鏈壘鍒拌澶囪矾鐢变俊鎭�"); - - task.CurrentAddress = task.NextAddress; - task.NextAddress = routers.FirstOrDefault().ChildPosi; - - task.ModifyDate = DateTime.Now; - task.Modifier = "System"; - BaseDal.UpdateData(task); - - _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"绯荤粺鑷姩娴佺▼锛屾洿鏂板綋鍓嶄綅缃�恵oldCurrentPos} ----> {task.CurrentAddress}銆戝拰涓嬩竴浣嶇疆銆恵oldNextPos} ----> {task.NextAddress}銆�"); - return task; - } - catch (Exception ex) - { - } - return null; - } - - - public WebResponseContent StackCraneTaskCompleted(int taskNum) - { - WebResponseContent content = new WebResponseContent(); - try - { - Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); - if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); - - if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound && task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting) - { - /*List<Dt_Router> routers = _routerService.QueryNextRoutes(task.NextAddress, task.TargetAddress); - if (!routers.Any()) return WebResponseContent.Instance.Error($"鏈壘鍒拌澶囪矾鐢变俊鎭�");*/ - - task.TaskState = (int)TaskOutStatusEnum.OutFinish; - task.ModifyDate = DateTime.Now; - BaseDal.DeleteData(task); - _task_HtyService.AddTaskHty(task); - _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍑哄簱瀹屾垚"); - //todo 鍚屾鍒癢MS - - //鏆備笉鑰冭檻澶氫釜鍑哄簱鍙� - } - else if (task.TaskType == (int)TaskInboundTypeEnum.Inbound && task.TaskState == (int)TaskInStatusEnum.SC_InExecuting) - { - //todo - //int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>(); - task.TaskState = (int)TaskInStatusEnum.InFinish; - task.ModifyDate = DateTime.Now; - task.Modifier = "System"; - BaseDal.DeleteData(task); - _task_HtyService.AddTaskHty(task); - _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"鍏ュ簱瀹屾垚"); - - } - else - { - throw new Exception($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�"); - } - content = WebResponseContent.Instance.OK(); - } - catch (Exception ex) - { - content = WebResponseContent.Instance.Error($"浠诲姟瀹屾垚寮傚父,浠诲姟鍙�:銆恵taskNum}銆�"); - } - return content; - } - - /// <summary> - /// 鎭㈠鎸傝捣浠诲姟 - /// </summary> - /// <param name="taskNum">浠诲姟鍙�</param> - /// <returns>杩斿洖澶勭悊缁撴灉</returns> - public WebResponseContent TaskStatusRecovery(int taskNum) - { - WebResponseContent content = new WebResponseContent(); - try - { - Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); - if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); - if (task.TaskState != (int)TaskInStatusEnum.InPending && task.TaskState != (int)TaskOutStatusEnum.OutPending) - { - return content = WebResponseContent.Instance.Error($"璇ヤ换鍔$姸鎬佷笉鍙仮澶�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�"); - } - - Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.IsNormal, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } }); - if (taskExecuteDetail != null) - { - task.TaskState = taskExecuteDetail.TaskState; - } - else - { - if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) - { - task.TaskState = (int)TaskOutStatusEnum.OutNew; - } - else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) - { - task.TaskState = (int)TaskInStatusEnum.InNew; - } - //todo - } - - task.ExceptionMessage = string.Empty; - - BaseDal.UpdateData(task); - - _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐鎭㈠鎸傝捣浠诲姟,鎭㈠鎸傝捣鏃朵换鍔$姸鎬併�恵task.TaskState}銆�"); - - content = WebResponseContent.Instance.OK(); - } - catch (Exception ex) - { - content = WebResponseContent.Instance.Error(ex.Message); - } - return content; - } - - /// <summary> - /// 鍥炴粴浠诲姟鐘舵�� - /// </summary> - /// <param name="taskNum">浠诲姟鍙�</param> - /// <returns>杩斿洖澶勭悊缁撴灉</returns> - public WebResponseContent RollbackTaskStatusToLast(int taskNum) - { - WebResponseContent content = new(); - try - { - Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); - if (task == null) return WebResponseContent.Instance.Error($"鏈壘鍒拌浠诲姟淇℃伅,浠诲姟鍙�:銆恵taskNum}銆�"); - - int oldState = task.TaskState; - Dt_TaskExecuteDetail taskExecuteDetail = _taskExecuteDetailRepository.QueryFirst(x => x.TaskId == task.TaskId && x.TaskState < task.TaskState && x.TaskState > 0, new Dictionary<string, OrderByType> { { nameof(Dt_TaskExecuteDetail.TaskDetailId), OrderByType.Desc } }); - if (taskExecuteDetail != null) - { - task.TaskState = taskExecuteDetail.TaskState; - task.CurrentAddress = taskExecuteDetail.CurrentAddress; - task.NextAddress = taskExecuteDetail.NextAddress; - } - else - { - return content = WebResponseContent.Instance.Error($"鏈壘鍒颁换鍔℃槑缁嗕俊鎭�,璇ヤ换鍔$姸鎬佷笉鍙洖婊氬埌涓婁竴姝�,浠诲姟鍙�:銆恵taskNum}銆�,浠诲姟鐘舵��:銆恵task.TaskState}銆�"); - } - - task.ExceptionMessage = string.Empty; - - BaseDal.UpdateData(task); - - _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"浜哄伐灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戝洖婊氬埌銆恵task.TaskState}銆�"); - - content = WebResponseContent.Instance.OK(); - } - catch (Exception ex) - { - content = WebResponseContent.Instance.Error(ex.Message); - } - return content; - } - - - /// <summary> - /// 鍒犻櫎鏁版嵁 - /// </summary> - /// <param name="keys">涓婚敭鏁扮粍</param> - /// <returns></returns> - public virtual WebResponseContent DeleteData(object[] keys) - { - try - { - List<Dt_Task> tasks = BaseDal.QureyDataByIds(keys); - foreach (Dt_Task task in tasks) - { - _task_HtyService.AddTaskHty(task); - } - - - if (typeof(Dt_Task).GetNavigatePro() == null) - return BaseDal.DeleteDataByIds(keys) ? WebResponseContent.Instance.OK() : WebResponseContent.Instance.Error(); - else - { - if (keys != null) - { - Type detailType = typeof(Dt_Task).GetDetailType(); - string name = typeof(Dt_Task).GetMainIdByDetail(); - List<object> dynamicDelKeys = new List<object>(); - - for (int i = 0; i < keys.Length; i++) + lock (placedBlocks) { - dynamicDelKeys.Add(keys[i]); + int length = Convert.ToInt32(orderDetails[i].Orderdetails_length); + int width = Convert.ToInt32(orderDetails[i].Orderdetails_width); + int height = Convert.ToInt32(orderDetails[i].Orderdetails_thickness); + + 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, + }; + int containerLength = putContainer.ContainerLength; + int containerWidth = putContainer.ContainerWidth; + int maxValue = Math.Max(length, width); + int minValue = Math.Min(length, width); + if (minValue > putContainer.ContainerWidth) + { + containerLength = maxValue; + containerWidth = minValue; + } + + orderContainer.MaxLength = containerLength; + orderContainer.MaxWidth = containerWidth; + 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); + + Thread.Sleep(1000); + object obj = new + { + x = taskPosition.PutCenterPositionX - putContainer.ContainerLength / 2, + y = taskPosition.PutCenterPositionY - putContainer.ContainerWidth / 2, + z = taskPosition.PutPositionZ, + length = length > width ? length : width, + width = width > length ? length : width, + height, + }; + _webSocketServer.PublishAllClientPayload(obj.Serialize()); + } + } } - ((SqlSugarClient)BaseDal.Db).BeginTran(); - - if (dynamicDelKeys.Count > 0) - BaseDal.Db.Deleteable<object>().AS(detailType.Name).Where($"{name} in (@id)", new { id = dynamicDelKeys.ToArray() }).ExecuteCommandHasChange(); - - BaseDal.DeleteDataByIds(keys); - - ((SqlSugarClient)BaseDal.Db).CommitTran(); - - return WebResponseContent.Instance.OK(); } - else + catch (Exception ex) { - return WebResponseContent.Instance.Error("鍙傛暟閿欒"); + } } + return WebResponseContent.Instance.OK(data: placedBlocks); } catch (Exception ex) { - ((SqlSugarClient)BaseDal.Db).RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } - //agv浠诲姟 - public WebResponseContent GetAgvTaskData() + /// <summary> + /// 鍒涘缓浠诲姟骞惰绠楃墿鍝佹斁缃綅缃� + /// </summary> + /// <param name="takePosition">鍙栬揣浣嶇疆缂栫爜</param> + /// <param name="putPosition">鏀捐揣浣嶇疆缂栫爜</param> + /// <param name="deviceCode">璁惧缂栫爜</param> + /// <param name="length">鐗╁搧闀垮害</param> + /// <param name="width">鐗╁搧瀹藉害</param> + /// <param name="height">鐗╁搧楂樺害</param> + /// <returns>鍖呭惈鎿嶄綔缁撴灉鐨刉eb鍝嶅簲鍐呭</returns> + /// <remarks> + /// 1. 楠岃瘉鍙栬揣/鏀捐揣浣嶇疆鏄惁瀛樺湪 <br/> + /// 2. 璁$畻鐗╁搧鍦ㄥ鍣ㄤ腑鐨勬渶浣虫斁缃綅缃� <br/> + /// 3. 鍒涘缓瀹瑰櫒鐗╁搧璁板綍鍜屼换鍔¤褰� <br/> + /// 4. 閫氳繃WebSocket閫氱煡瀹㈡埛绔� + /// </remarks> + public WebResponseContent CreateTask(string takePosition, string putPosition, string deviceCode, int length, int width, int height) { - WebResponseContent content=new WebResponseContent(); - List<Dt_Task> tasks = BaseDal.QueryData().ToList(); - List<AGCTaskDto> agvdto = new List<AGCTaskDto>(); - foreach (var item in tasks) - { - AGCTaskDto aGCTaskDto = new AGCTaskDto(); - aGCTaskDto.TaskNum = item.TaskNum; - aGCTaskDto.SourceAddress= item.SourceAddress; - aGCTaskDto.TargetAddress= item.TargetAddress==null? "鏆傚畾" : item.TargetAddress; - aGCTaskDto.Dispatchertime = item.Dispatchertime; - aGCTaskDto.TaskState = item.TaskState == (int)TaskInStatusEnum.InNew ? "鏂板缓浠诲姟" : (item.TaskState == (int)TaskInStatusEnum.AGV_InExecuting ? "AGV浠诲姟鎵ц" : "浠诲姟瀹屾垚"); - aGCTaskDto.TaskType = item.TaskType.ToString(); - aGCTaskDto.Roadway = item.Roadway=="1"?"鍖哄煙涓�":(item.Roadway == "2" ? "鍖哄煙浜�": item.Roadway == "3" ? "鍖哄煙涓�":"鍖哄煙鍥�"); - agvdto.Add(aGCTaskDto); - } - return content.OK(data: agvdto); - } - - //agv鐘舵�� - public WebResponseContent GetAgvStatusData() - { - var response = new WebResponseContent(); try { - //agv绫诲瀷锛�0-娼滀紡鍨嬶紝1 - 鐗靛紩鍨嬶紝2 - 鎵胯浇鍨嬶紝3 - 涓惧崌鍨嬶紝4 -杈婇亾鍨嬶紝5 - 鍙夎溅鍨嬶紝6 - 鍏朵粬 - int agvType = 0; - //agv缂栧彿 - int agvCode = 2; - //agv涓婁笅绾跨姸鎬侊紝0-涓嬬嚎锛�1 - 涓婄嚎 - int agvOnline = 4; - //agv褰撳墠鍦版爣鍙� - int agvRfidLabel = 6; - //agv褰撳墠x鍧愭爣鍊� - int agvXcoordinate = 8; - //agv褰撳墠y鍧愭爣鍊� - int agvYcoordinate = 12; - //agv杩愯鐘舵�� 锛�0-鍋滄锛�1 - 琛岄┒锛�2 - 鏆傚仠 - int agvStatus = 16; - //agv褰撳墠杩愯閫熷害(mm / s) - int agvSpeed = 18; - //agv鎶ヨ浠g爜(鎸変綅鐘舵�佹彁鍙栵紝鏈�澶氬彲琛ㄧず32绉嶆姤璀� - int agvAlarmCode = 20; - bool isFirst = true; - List<AGVStatus> statusList = new List<AGVStatus>(); - - for (int i = 0; i < 3; i++) + Dt_Container takeContainer = _containerRepository.QueryFirst(x => x.ContainerCode == takePosition && x.ContainerType == ContainerTypeEnum.TakeContainer.ObjToInt()); + if (takeContainer == null) { - AGVStatus aGVStatus = new AGVStatus(); - aGVStatus.agvCode = i; - aGVStatus.agvType = 1+i; - aGVStatus.agvOnline = "123" + i; - aGVStatus.agvRfidLabel = 2 + i; - aGVStatus.agvXcoordinate = 3 + i; - aGVStatus.agvYcoordinate = 4 + i; - aGVStatus.agvStatus = 5 + i; - aGVStatus.agvSpeed = 6 + i; - aGVStatus.agvAlarmCode = i+99; //client.SiemensPLCClient.SiemensS7NetClient.Read("DB1001." + agvAlarmCode.ToString(), 32).Content; - statusList.Add(aGVStatus); - + return WebResponseContent.Instance.Error("鍙栬揣浣嶇疆涓嶅瓨鍦�"); } - - response.OK(data: statusList); + + 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.ItemLength ? x.ItemLength : x.ItemWidth, x.ItemLength > x.ItemLength ? x.ItemWidth : x.ItemLength, x.ItemHeight)).ToList(); + + + TaskPosition? taskPosition = _containerService.GetTaskPosition(length, width, height, containerSize, placedBlocks, edge); + if (taskPosition == null) + { + 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() + { + ContainerId = putContainer.Id, + ItemCode = code, + 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 = code + }; + + Dt_Task dt_Task = new Dt_Task() + { + PalletCode = code, + DeviceCode = putContainer.DeviceCode, + TaskState = (int)TaskStatusEnum.Gantry_New, + 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, + }; + + _containerItemRepository.AddData(dt_ContainerItem); + base.AddData(dt_Task); + + return WebResponseContent.Instance.OK(); } catch (Exception ex) { - response.Error(ex.Message); + return WebResponseContent.Instance.Error(ex.Message); } - - return response; } - public WebResponseContent GetAgvStatusData2() + /// <summary> + /// 鏍规嵁璁㈠崟淇℃伅鐢熸垚浠诲姟 + /// </summary> + /// <param name="orderInfo">璁㈠崟淇℃伅</param> + /// <returns>鍖呭惈涓変釜鍊肩殑鍏冪粍锛� <br/> + /// Item1 - 鎿嶄綔鏄惁鎴愬姛 (bool) <br/> + /// Item2 - 鐢熸垚鐨勪换鍔″璞� (Dt_Task)锛屽け璐ユ椂涓簄ull <br/> + /// Item3 - 閿欒娑堟伅 (string)锛屾垚鍔熸椂涓虹┖瀛楃涓� + /// </returns> + /// <remarks> + /// 璇ユ柟娉曚細锛� <br/> + /// 1. 鏍规嵁璁㈠崟灏哄鑾峰彇鍚堥�傜殑璐т綅 <br/> + /// 2. 鍒涘缓瀹瑰櫒椤瑰拰浠诲姟璁板綍 <br/> + /// 3. 鏇存柊鐩稿叧瀹瑰櫒鐘舵�� <br/> + /// 4. 鍦ㄤ簨鍔′腑鎵ц鎵�鏈夋暟鎹簱鎿嶄綔 + /// </remarks> + public (bool, Dt_Task?, string) GenerateTask(OrderInfo orderInfo) { - var response = new WebResponseContent(); try { - //agv绫诲瀷锛�0-娼滀紡鍨嬶紝1 - 鐗靛紩鍨嬶紝2 - 鎵胯浇鍨嬶紝3 - 涓惧崌鍨嬶紝4 -杈婇亾鍨嬶紝5 - 鍙夎溅鍨嬶紝6 - 鍏朵粬 - int agvType = 0; - //agv缂栧彿 - int agvCode = 2; - //agv涓婁笅绾跨姸鎬侊紝0-涓嬬嚎锛�1 - 涓婄嚎 - int agvOnline = 4; - //agv褰撳墠鍦版爣鍙� - int agvRfidLabel = 6; - //agv褰撳墠x鍧愭爣鍊� - int agvXcoordinate = 8; - //agv褰撳墠y鍧愭爣鍊� - int agvYcoordinate = 12; - //agv杩愯鐘舵�� 锛�0-鍋滄锛�1 - 琛岄┒锛�2 - 鏆傚仠 - int agvStatus = 16; - //agv褰撳墠杩愯閫熷害(mm / s) - int agvSpeed = 18; - //agv鎶ヨ浠g爜(鎸変綅鐘舵�佹彁鍙栵紝鏈�澶氬彲琛ㄧず32绉嶆姤璀� - int agvAlarmCode = 20; - bool isFirst = true; - List<AGVStatus> statusList = new List<AGVStatus>(); + int length = Convert.ToInt32(orderInfo.Length); + int width = Convert.ToInt32(orderInfo.Width); + int height = Convert.ToInt32(orderInfo.Thickness); - for (int i = 0; i < 6; i++) + var (flag, taskPosition, message) = _containerService.GetPosition(orderInfo.OrderHeadId, orderInfo.OrderNo, length, width, height); + if (flag && taskPosition != null) { - AGVStatus aGVStatus = new AGVStatus(); - aGVStatus.agvCode = i; - aGVStatus.agvType = 1 + i; - aGVStatus.agvOnline = "123" + i; - aGVStatus.agvRfidLabel = 2 + i; - aGVStatus.agvXcoordinate = 3 + i; - aGVStatus.agvYcoordinate = 4 + i; - aGVStatus.agvStatus = 5 + i; - aGVStatus.agvSpeed = 6 + i; - aGVStatus.agvAlarmCode = i + 99; //client.SiemensPLCClient.SiemensS7NetClient.Read("DB1001." + agvAlarmCode.ToString(), 32).Content; - statusList.Add(aGVStatus); + 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, + }; + + int containerLength = putContainer.ContainerLength; + int containerWidth = putContainer.ContainerWidth; + int maxValue = Math.Max(length, width); + int minValue = Math.Min(length, width); + if (minValue > putContainer.ContainerWidth) + { + containerLength = maxValue; + containerWidth = minValue; + } + + orderContainer.MaxLength = containerLength; + orderContainer.MaxWidth = containerWidth; + 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, ""); } - - response.OK(data: statusList); + else + { + return (false, null, message); + } } catch (Exception ex) { - response.Error(ex.Message); + _unitOfWorkManage.RollbackTran(); + return (false, null, $"閿欒,{ex.ExceptionToString()}"); } - - return response; } - - public class AGVStatus + /// <summary> + /// 閲嶆柊鐢熸垚浠诲姟 + /// </summary> + /// <param name="task">鍘熷浠诲姟瀵硅薄</param> + /// <param name="stationCode">宸ヤ綔绔欑紪鐮�</param> + /// <returns> + /// 鍖呭惈涓変釜鍊肩殑鍏冪粍锛� <br/> + /// 1. bool - 鎿嶄綔鏄惁鎴愬姛 <br/> + /// 2. Dt_Task - 鏇存柊鍚庣殑浠诲姟瀵硅薄锛堝け璐ユ椂涓簄ull锛� <br/> + /// 3. string - 閿欒娑堟伅锛堟垚鍔熸椂涓虹┖瀛楃涓诧級 + /// </returns> + /// <remarks> + /// 璇ユ柟娉曠敤浜庨噸鏂扮敓鎴愪换鍔′俊鎭紝鍖呮嫭锛� <br/> + /// 1. 瑙f瀽鏉垮瓙灏哄淇℃伅 <br/> + /// 2. 楠岃瘉鍙栬揣/鏀捐揣浣嶇疆 <br/> + /// 3. 璁$畻鐗╁搧鏀剧疆浣嶇疆 <br/> + /// 4. 鏇存柊浠诲姟鐘舵�佸拰浣嶇疆淇℃伅 <br/> + /// 5. 鍦ㄤ簨鍔′腑鏇存柊鏁版嵁搴撹褰� + /// </remarks> + public (bool, Dt_Task?, string) RegenerateTask(Dt_Task task, string stationCode) { - /// <summary> - /// agv绫诲瀷锛�0-娼滀紡鍨嬶紝1 - 鐗靛紩鍨嬶紝2 - 鎵胯浇鍨嬶紝3 - 涓惧崌鍨嬶紝4 -杈婇亾鍨嬶紝5 - 鍙夎溅鍨嬶紝6 - 鍏朵粬 - /// </summary> - public int agvType { get; set; } + try + { + int length = 0; + int width = 0; + int height = 0; + Dt_ContainerItem containerItem = _containerItemRepository.QueryFirst(x => x.ItemCode == task.PalletCode); + if (containerItem == null) + { + List<string> itemInfos = task.ItemInfo.Split("*").ToList(); + if (itemInfos.Count == 3) + { + length = Convert.ToInt32(itemInfos[0]); + width = Convert.ToInt32(itemInfos[1]); + height = Convert.ToInt32(itemInfos[2]); + } + else + { + return (false, null, "鏉垮瓙灏哄淇℃伅閿欒"); + } + } + else + { + length = containerItem.ItemLength; + width = containerItem.ItemWidth; + height = containerItem.ItemHeight; + } + string containerCode = task.NextAddress.Split("*")[0]; - /// <summary> - /// agv缂栧彿 - /// </summary> - public int agvCode { get; set; } + Dt_Container putContainer = _containerRepository.QueryFirst(x => x.ContainerCode == containerCode); - /// <summary> - /// agv涓婁笅绾跨姸鎬侊紝0-涓嬬嚎锛�1 - 涓婄嚎 - /// </summary> - public string agvOnline { get; set; } + if (putContainer == null) + { + return (false, null, "鏈壘鍒版斁璐т綅缃�"); + } - /// <summary> - /// agv褰撳墠鍦版爣鍙� - /// </summary> - public int agvRfidLabel { get; set; } + Dt_Container? takeContainer = _containerRepository.QueryFirst(x => x.ContainerCode == stationCode); + if (takeContainer == null) + { + return (false, null, "鏈壘鍒板彇璐т綅缃�"); + } - /// <summary> - /// agv褰撳墠x鍧愭爣鍊� - /// </summary> - public int agvXcoordinate { get; set; } + var (flag, taskPosition, message) = _containerService.GetPosition(putContainer, length, width, height); + if (!flag || taskPosition == null) + { + return (false, null, message); + } - /// <summary> - /// agv褰撳墠y鍧愭爣鍊� - /// </summary> - public int agvYcoordinate { get; set; } + Dt_OrderContainer orderContainer = _orderContainerRepository.QueryFirst(x => x.ContainerCode == putContainer.ContainerCode); - /// <summary> - /// agv杩愯鐘舵�� 锛�0-鍋滄锛�1 - 琛岄┒锛�2 - 鏆傚仠 - /// </summary> - public int agvStatus { get; set; } + bool isAdd = false; - /// <summary> - /// agv褰撳墠杩愯閫熷害(mm / s) - /// </summary> - public int agvSpeed { get; set; } + if (orderContainer == null) + { + return (false, null, "鏈壘鍒拌鍗曚笌瀹瑰櫒缁戝畾鍏崇郴"); + } - /// <summary> - /// agv鎶ヨ浠g爜(鎸変綅鐘舵�佹彁鍙栵紝鏈�澶氬彲琛ㄧず32绉嶆姤璀� - /// </summary> - public int agvAlarmCode { get; set; } + int containerLength = putContainer.ContainerLength; + int containerWidth = putContainer.ContainerWidth; + int maxValue = Math.Max(length, width); + int minValue = Math.Min(length, width); + if (minValue > putContainer.ContainerWidth) + { + containerLength = maxValue; + containerWidth = minValue; + } + + orderContainer.MaxLength = containerLength; + orderContainer.MaxWidth = containerWidth; + + if (containerItem == null) + { + containerItem = new Dt_ContainerItem() + { + ContainerId = putContainer.Id, + ItemCode = task.PalletCode, + 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 = task.PalletCode, + Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}" + }; + isAdd = true; + } + else + { + containerItem.ItemLength = length; + containerItem.ItemWidth = width; + containerItem.ItemHeight = height; + containerItem.ItemPositionX = taskPosition.PositionX; + containerItem.ItemPositionY = taskPosition.PositionY; + containerItem.ItemPositionZ = taskPosition.PositionZ; + containerItem.ItemRelaPositionX = taskPosition.PutPositionX; + containerItem.ItemRelaPositionY = taskPosition.PutPositionY; + containerItem.ItemRelaPositionZ = taskPosition.PutPositionZ; + containerItem.ItemStatus = (int)ItemStatusEnum.Assigned; + containerItem.Remark = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}"; + } + + task.TaskState = (int)TaskStatusEnum.Gantry_New; + task.CurrentAddress = $"{takeContainer.ContainerCode}*{taskPosition.TakePositionX}*{taskPosition.TakePositionY}*{taskPosition.TakePositionZ}*{taskPosition.PositionR}"; + task.NextAddress = $"{putContainer.ContainerCode}*{taskPosition.PutPositionX}*{taskPosition.PutPositionY}*{taskPosition.PutPositionZ}*{taskPosition.PositionR}"; + task.ItemInfo = $"{length}*{width}*{height}"; + + _unitOfWorkManage.BeginTran(); + BaseDal.UpdateData(task); + _containerRepository.UpdateData(putContainer); + _orderContainerRepository.UpdateData(orderContainer); + + if (isAdd) + { + _containerItemRepository.AddData(containerItem); + } + else + { + _containerItemRepository.UpdateData(containerItem); + } + _unitOfWorkManage.CommitTran(); + + return (true, task, ""); + + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + return (false, null, $"閿欒,{ex.ExceptionToString()}"); + } + } + + /// <summary> + /// 鐢熸垚寮傚父浠诲姟 + /// </summary> + /// <param name="orderInfo">璁㈠崟淇℃伅</param> + /// <returns>鍏冪粍鍖呭惈涓変釜鍊硷細 <br/> + /// Item1 - 鎿嶄綔鏄惁鎴愬姛锛坆ool锛� <br/> + /// Item2 - 鐢熸垚鐨勪换鍔″璞★紙Dt_Task锛夛紝澶辫触鏃朵负null <br/> + /// Item3 - 閿欒娑堟伅锛坰tring锛夛紝鎴愬姛鏃朵负绌哄瓧绗︿覆</returns> + /// <remarks> + /// 璇ユ柟娉曚細鏍规嵁璁㈠崟淇℃伅鐢熸垚涓�涓紓甯稿鐞嗕换鍔★紝鍖呮嫭锛� <br/> + /// 1. 鑾峰彇寮傚父浣嶇疆 <br/> + /// 2. 楠岃瘉鏀捐揣/鍙栬揣浣嶇疆 <br/> + /// 3. 鍒涘缓瀹瑰櫒椤瑰拰浠诲姟璁板綍 <br/> + /// 4. 鎻愪氦浜嬪姟 + /// </remarks> + public (bool, Dt_Task?, string) GenerateExceptionTask(OrderInfo orderInfo) + { + int length = Convert.ToInt32(orderInfo.Length); + int width = Convert.ToInt32(orderInfo.Width); + int height = Convert.ToInt32(orderInfo.Thickness); + + var (flag, taskPosition, message) = _containerService.GetExceptionPosition(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_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, + }; + + if (taskPosition.TakeCenterPositionZ == 99) + { + dt_Task.TaskState = (int)TaskStatusEnum.Gantry_BeRelease; + } + + _unitOfWorkManage.BeginTran(); + BaseDal.AddData(dt_Task); + _containerItemRepository.AddData(dt_ContainerItem); + _unitOfWorkManage.CommitTran(); + + return (true, dt_Task, ""); + } + else + { + return (false, null, message); + } + } + + /// <summary> + /// 鏍规嵁璁惧缂栧彿鑾峰彇鍙栬揣浣嶇疆 + /// </summary> + /// <param name="deviceCode">璁惧缂栧彿</param> + /// <returns>绗﹀悎鏉′欢鐨勫鍣ㄥ璞★紝鑻ユ壘涓嶅埌鍒欒繑鍥瀗ull</returns> + /// <remarks> + /// 1. 棣栧厛鏌ヨ鎸囧畾璁惧涓嬫墍鏈夊彲鐢ㄧ殑鍙栬揣瀹瑰櫒锛屽苟鎸塁ontainerSort鍗囧簭鎺掑簭 <br/> + /// 2. 鏌ユ壘璇ヨ澶囨渶杩戠殑浠诲姟璁板綍 <br/> + /// 3. 濡傛灉鎵惧埌浠诲姟璁板綍锛屽垯鏍规嵁浠诲姟婧愬湴鍧�鍖归厤瀹瑰櫒锛岃繑鍥炰笅涓�涓鍣�(鑻ュ凡鏄渶鍚庝竴涓垯杩斿洖绗竴涓�) <br/> + /// 4. 濡傛灉鍑虹幇寮傚父鎴栨湭鎵惧埌鍖归厤椤癸紝鍒欒繑鍥炵涓�涓彲鐢ㄥ鍣� + /// </remarks> + 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(); + } + + /// <summary> + /// 浠诲姟瀹屾垚澶勭悊鏂规硶 + /// </summary> + /// <param name="task">浠诲姟瀹炰綋</param> + /// <returns>Web鍝嶅簲鍐呭</returns> + /// <remarks> + /// 1. 鏇存柊浠诲姟鐘舵�佷负"榫欓棬鏋跺畬鎴�" <br/> + /// 2. 鏇存柊鐩稿叧璁㈠崟璇︽儏鐘舵�佷负"鐮佸灈鎴愬姛" <br/> + /// 3. 鏇存柊璁㈠崟琛屼腑鐨勬墭鐩樻暟閲� <br/> + /// 4. 鏍规嵁浠诲姟瀹屾垚鎯呭喌鍙戦�乄ebSocket閫氱煡 <br/> + /// 5. 璁板綍鎿嶄綔鏃ュ織骞舵彁浜や簨鍔� <br/> + /// 6. 寮傚父鏃跺洖婊氫簨鍔″苟杩斿洖閿欒淇℃伅 + /// </remarks> + 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); + + if (container.ContainerType == ContainerTypeEnum.ExceptionContainer.ObjToInt()) + { + int count = Db.Queryable<Dt_ContainerItem>().Count(x => x.ContainerId == container.Id); + if (count >= 5) + { + if (LightStatusStorage.LightStatusDic.ContainsKey(container.ContainerCode)) + { + LightStatusStorage.LightStatusDic[container.ContainerCode] = LightStatusEnum.LightError; + } + } + } + + 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(); + + List<object> orderData = new List<object>(); + foreach (var item in details) + { + object obj = new + { + name = item.Orderdetails_name, + baseName = item.Orderdetails_productName, + size = $"{item.Orderdetails_length}*{item.Orderdetails_width}*{item.Orderdetails_thickness}", + process = "", + }; + orderData.Add(obj); + } + object data = new + { + orderCode = orderrows.Orderrows_orderid, + orderName = orderrows.Orderrows_name, + cusName = orderrows.Orderrows_customer, + stationCode = container.ContainerCode, + orderTotalNum = totalDetails.Count, + sortedNum = sortedNum, + unsortedNum = totalDetails.Count - sortedNum, + stationSortedNum = details.Count, + orderData = orderData, + orderId = orderrows.id, + release = 0 + }; + + + _webSocketServer.PublishAllClientPayload(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