| Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_AGV.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_WCS.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -74,1450 +74,5 @@ _unitOfWorkManage = unitOfWorkManage; } #region WCSé»è¾å¤ç /// <summary> /// å建任å¡ï¼ç»çå ¥åºä»»å¡ã空æçååºä»»å¡ï¼ /// </summary> public async Task<WebResponseContent> CreateTaskInboundAsync(CreateTaskDto taskDto) { try { WebResponseContent content = await GetTaskByPalletCodeAsync(taskDto.PalletCode); if (content.Status) { return content; } if (string.IsNullOrWhiteSpace(taskDto.PalletCode) || string.IsNullOrWhiteSpace(taskDto.Roadway)) { return WebResponseContent.Instance.Error("æ æçä»»å¡è¯¦æ "); } if (taskDto.TaskType != TaskTypeEnum.Inbound && taskDto.TaskType != TaskTypeEnum.InEmpty) { return WebResponseContent.Instance.Error("æ æçä»»å¡è¯¦æ "); } // ä½¿ç¨ switch è¡¨è¾¾å¼æ å°ä»»å¡ç±»å int taskInboundType = taskDto.TaskType switch { TaskTypeEnum.Inbound => TaskInboundTypeEnum.Inbound.GetHashCode(), TaskTypeEnum.InEmpty => TaskInboundTypeEnum.InEmpty.GetHashCode(), _ => 0 // ç论ä¸ä¸ä¼èµ°å°è¿éï¼å 为已ç»éªè¯è¿äº }; var task = new Dt_Task { TaskNum = await BaseDal.GetTaskNo(), PalletCode = taskDto.PalletCode, PalletType = taskDto.PalletType, Roadway = taskDto.Roadway, TaskType = taskInboundType, TaskStatus = TaskInStatusEnum.InNew.GetHashCode(), SourceAddress = taskDto.SourceAddress, TargetAddress = taskDto.TargetAddress, CurrentAddress = taskDto.SourceAddress, NextAddress = taskDto.TargetAddress, WarehouseId = taskDto.WarehouseId, Grade = 1, Creater = "system" }; var result = await Repository.AddDataAsync(task) > 0; if (!result) return WebResponseContent.Instance.Error("ä»»å¡å建失败"); var wmstaskDto = _mapper.Map<WMSTaskDTO>(task); return WebResponseContent.Instance.OK("ä»»å¡å建æå", wmstaskDto); } catch (Exception ex) { return WebResponseContent.Instance.Error($"ä»»å¡å建失败: {ex.Message}"); } } /// <summary> /// æ ¹æ®æå®çä»»å¡è¯¦æ 弿¥å建æ°çåºåºä»»å¡ /// </summary> public async Task<WebResponseContent> CreateTaskOutboundAsync(CreateTaskDto taskDto) { try { var stockResult = await _stockInfoService.GetStockInfoAsync(taskDto.WarehouseId); if (stockResult == null || !stockResult.Any()) return WebResponseContent.Instance.Error("æªæ¾å°åºåä¿¡æ¯"); var taskList = stockResult.Select(item => new Dt_Task { WarehouseId = item.WarehouseId, PalletCode = item.PalletCode, PalletType = item.PalletType, SourceAddress = item.LocationCode, TargetAddress = taskDto.TargetAddress, Roadway = item.LocationDetails.RoadwayNo, TaskType = TaskTypeEnum.Outbound.GetHashCode(), TaskStatus = TaskStatusEnum.New.GetHashCode(), Grade = 1, TaskNum = 0, CurrentAddress = item.LocationCode, NextAddress = taskDto.TargetAddress, Creater = "system", }).ToList(); var result = await BaseDal.AddDataAsync(taskList) > 0; var wmstaskDto = result ? _mapper.Map<WMSTaskDTO>(taskList) : null; return WebResponseContent.Instance.OK(result ? "ä»»å¡å建æå" : "ä»»å¡å建失败", wmstaskDto ?? new object()); } catch (Exception ex) { return WebResponseContent.Instance.Error($"ä»»å¡å建失败: {ex.Message}"); } } /// <summary> /// è·åå¯å ¥åºè´§ä½ /// </summary> public async Task<WebResponseContent> GetTasksLocationAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var locationInfo = await _locationInfoService.GetLocationInfo(task.Roadway); if (locationInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); return await ExecuteWithinTransactionAsync(async () => { locationInfo.LocationStatus = LocationStatusEnum.FreeLock.GetHashCode(); task.CurrentAddress = task.SourceAddress; task.NextAddress = locationInfo.LocationCode; task.TargetAddress = locationInfo.LocationCode; task.TaskStatus = TaskInStatusEnum.Line_InFinish.GetHashCode(); var updateTaskResult = await BaseDal.UpdateDataAsync(task); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(locationInfo); if (!updateTaskResult || !updateLocationResult) { return WebResponseContent.Instance.Error("任塿´æ°å¤±è´¥"); } return WebResponseContent.Instance.OK("任塿´æ°æå", locationInfo.LocationCode); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"è·åä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// å ¥åºä»»å¡å®æï¼æ·»å åºåï¼ä¿®æ¹è´§ä½ç¶æï¼å é¤ä»»å¡æ°æ®ï¼æ·»å åå²ä»»å¡æ°æ® /// </summary> public async Task<WebResponseContent> InboundFinishTaskAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.TargetAddress); if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); // 夿æ¯ä¸æ¯æå·åºä»»å¡ //if (taskDto.WarehouseId == (int)WarehouseEnum.FJ1 || taskDto.WarehouseId == (int)WarehouseEnum.ZJ1) //{ // return WebResponseContent.Instance.OK(); //} return await ExecuteWithinTransactionAsync(async () => { WebResponseContent content = new WebResponseContent(); stockInfo.LocationCode = location.LocationCode; stockInfo.LocationId = location.Id; stockInfo.OutboundDate = task.Roadway switch { var r when r.Contains("GW") => DateTime.Now.AddHours(2), var r when r.Contains("CW") => DateTime.Now.AddHours(1), _ => DateTime.Now }; stockInfo.StockStatus = StockStatusEmun.å ¥åºå®æ.GetHashCode(); location.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateLocationResult || !updateStockResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); // è°ç¨MESæçè¿ç« var inboundRequest = new InboundInContainerRequest { EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainerCode = taskDto.PalletCode }; var inboundResult = _mesService.InboundInContainer(inboundRequest); if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess) { return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESè¿ç«å¤±è´¥: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "æªç¥é误"}"); } return await CompleteTaskAsync(task, "å ¥åºå®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// åºåºä»»å¡å®æ ï¼ä¿®æ¹åºåï¼ä¿®æ¹è´§ä½ç¶æï¼å é¤ä»»å¡æ°æ®ï¼æ·»å åå²ä»»å¡æ°æ® /// </summary> public async Task<WebResponseContent> OutboundFinishTaskAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress); if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); // 夿æ¯ä¸æ¯æå·åºä»»å¡ if (taskDto.WarehouseId == (int)WarehouseEnum.FJ1 || taskDto.WarehouseId == (int)WarehouseEnum.ZJ1) { OutTaskCompleteDto outTaskCompleteDto = new OutTaskCompleteDto() { TaskId = task.OrderNo, DevId = task.TargetAddress, ReqTime = DateTime.Now.ToString() }; return await OutTaskComplete(outTaskCompleteDto); } WebResponseContent content = new WebResponseContent(); return await ExecuteWithinTransactionAsync(async () => { stockInfo.LocationId = 0; stockInfo.LocationCode = null; stockInfo.OutboundDate = DateTime.Now; location.LocationStatus = LocationStatusEnum.Free.GetHashCode(); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateLocationResult || !updateStockResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); // è°ç¨MESæçåºç« var outboundRequest = new OutboundInContainerRequest { EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainerCode = taskDto.PalletCode, ParamList = new List<ParamItem>() }; var outboundResult = _mesService.OutboundInContainer(outboundRequest); if (outboundResult == null || outboundResult.Data == null || !outboundResult.Data.IsSuccess) { return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESåºç«å¤±è´¥: {outboundResult?.Data?.Msg ?? outboundResult?.ErrorMessage ?? "æªç¥é误"}"); } return await CompleteTaskAsync(task, "åºåºå®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// ç§»åºä»»å¡å®æï¼ä¿®æ¹åºåä½ç½®ä¸ç¶æï¼ä¿®æ¹æº/ç®æ è´§ä½ç¶æï¼å é¤ä»»å¡æ°æ® /// </summary> public async Task<WebResponseContent> RelocationFinishTaskAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode && s.TaskType == TaskRelocationTypeEnum.Relocation.GetHashCode()); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçç§»åºä»»å¡"); var sourceLocation = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress); if (sourceLocation == null) return WebResponseContent.Instance.Error("æªæ¾å°ç§»åºæºè´§ä½"); var targetLocation = await _locationInfoService.GetLocationInfo(task.Roadway, task.TargetAddress); if (targetLocation == null) return WebResponseContent.Instance.Error("æªæ¾å°ç§»åºç®æ è´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); return await ExecuteWithinTransactionAsync(async () => { stockInfo.LocationCode = targetLocation.LocationCode; stockInfo.LocationId = targetLocation.Id; stockInfo.StockStatus = StockStatusEmun.å ¥åºå®æ.GetHashCode(); sourceLocation.LocationStatus = LocationStatusEnum.Free.GetHashCode(); targetLocation.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); var updateSourceResult = await _locationInfoService.UpdateLocationInfoAsync(sourceLocation); var updateTargetResult = await _locationInfoService.UpdateLocationInfoAsync(targetLocation); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateSourceResult || !updateTargetResult || !updateStockResult) return WebResponseContent.Instance.Error("ç§»åºä»»å¡å®æå¤±è´¥"); return await CompleteTaskAsync(task, "ç§»åºå®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// å建空æçå ¥åºä»»å¡ /// </summary> /// <param name="taskDto"></param> /// <returns></returns> public async Task<WebResponseContent> CreateTaskInboundTrayAsync(CreateTaskDto taskDto) { try { WebResponseContent content = await GetTaskByPalletCodeAsync(taskDto.PalletCode); if (content.Status) { return content; } //var tasks = await BaseDal.QueryAsync(s => s.PalletCode == palletCode); //if (tasks == null || !tasks.Any()) // return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); //var taskDtos = _mapper.Map<List<WMSTaskDTO>>(tasks); return WebResponseContent.Instance.OK("æ¥è¯¢æå"/*, taskDtos*/); } catch (Exception ex) { return WebResponseContent.Instance.Error($"æ¥è¯¢ä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// 空æçå ¥åºå®æ /// </summary> public async Task<WebResponseContent> InboundFinishTaskTrayAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.TargetAddress); if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); return await ExecuteWithinTransactionAsync(async () => { stockInfo.LocationCode = location.LocationCode; stockInfo.LocationId = location.Id; stockInfo.StockStatus = StockStatusEmun.空æçåºå.GetHashCode(); location.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateLocationResult || !updateStockResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); // ä¿åä»»å¡åå² var historyTask = _mapper.Map<Dt_Task_Hty>(task); historyTask.InsertTime = DateTime.Now; historyTask.OperateType = "空æçå ¥åºå®æ"; if (await _task_HtyService.Repository.AddDataAsync(historyTask) <= 0) return WebResponseContent.Instance.Error("ä»»å¡åå²ä¿å失败"); // ä¿ååºååå² var historyStock = _mapper.Map<Dt_StockInfo_Hty>(stockInfo); historyStock.InsertTime = DateTime.Now; historyStock.OperateType = "空æçå ¥åºå®æ"; if (await _stockInfo_HtyService.Repository.AddDataAsync(historyStock) <= 0) return WebResponseContent.Instance.Error("åºååå²ä¿å失败"); var deleteResult = await BaseDal.DeleteDataAsync(task); if (!deleteResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); return WebResponseContent.Instance.OK("ä»»å¡å®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// å建空æçåºåºä»»å¡ /// </summary> /// <param name="taskDto"></param> /// <returns></returns> public async Task<WebResponseContent> GetOutBoundTrayTaskAsync(CreateTaskDto taskDto) { try { var stockInfo = await _stockInfoService.Repository.QueryDataNavFirstAsync(x => x.LocationDetails.WarehouseId == taskDto.WarehouseId && x.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode() && x.StockStatus == StockStatusEmun.空æçåºå.GetHashCode()); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçåºåä¿¡æ¯"); var task = new Dt_Task() { WarehouseId = stockInfo.LocationDetails.WarehouseId, PalletCode = stockInfo.PalletCode, PalletType = stockInfo.PalletType, SourceAddress = stockInfo.LocationCode, CurrentAddress = stockInfo.LocationCode, NextAddress = taskDto.TargetAddress, TargetAddress = taskDto.TargetAddress, Roadway = stockInfo.LocationDetails.RoadwayNo, TaskType = TaskOutboundTypeEnum.OutEmpty.GetHashCode(), TaskStatus = TaskStatusEnum.New.GetHashCode(), Grade = 1, TaskNum = await BaseDal.GetTaskNo(), Creater = "system", }; var taskDtos = task.Adapt<WMSTaskDTO>(); var addResult = await BaseDal.AddDataAsync(task) > 0; if (!addResult) return WebResponseContent.Instance.Error("ä»»å¡å建失败"); return WebResponseContent.Instance.OK("ä»»å¡å建æå", taskDtos); } catch (Exception ex) { return WebResponseContent.Instance.Error($"æ¥è¯¢ä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// 空æçåºåºå®æ /// </summary> public async Task<WebResponseContent> OutboundFinishTaskTrayAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress); if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); return await ExecuteWithinTransactionAsync(async () => { stockInfo.LocationId = 0; stockInfo.LocationCode = null; stockInfo.StockStatus = StockStatusEmun.åºåºå®æ.GetHashCode(); location.LocationStatus = LocationStatusEnum.Free.GetHashCode(); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateLocationResult || !updateStockResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); // ä¿åä»»å¡åå² var historyTask = _mapper.Map<Dt_Task_Hty>(task); historyTask.InsertTime = DateTime.Now; historyTask.OperateType = "空æçåºåºå®æ"; if (await _task_HtyService.Repository.AddDataAsync(historyTask) <= 0) return WebResponseContent.Instance.Error("ä»»å¡åå²ä¿å失败"); // ä¿ååºååå² var historyStock = _mapper.Map<Dt_StockInfo_Hty>(stockInfo); historyStock.InsertTime = DateTime.Now; historyStock.OperateType = "空æçåºåºå®æ"; if (await _stockInfo_HtyService.Repository.AddDataAsync(historyStock) <= 0) return WebResponseContent.Instance.Error("åºååå²ä¿å失败"); var deleteResult = await BaseDal.DeleteDataAsync(task); if (!deleteResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); return WebResponseContent.Instance.OK("ä»»å¡å®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// ä¿®æ¹ä»»å¡ç¶æï¼æ ¹æ®ä»»å¡IDä¿®æ¹ä¸ºæå®ç¶æï¼ /// </summary> /// <param name="taskId"></param> /// <param name="newStatus"></param> /// <returns></returns> public async Task<WebResponseContent> UpdateTaskByStatusAsync(int taskId, int newStatus) { try { var tasks = await BaseDal.QueryFirstAsync(s => s.TaskNum == taskId); if (tasks == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); tasks.TaskStatus = newStatus; await BaseDal.UpdateDataAsync(tasks); return WebResponseContent.Instance.OK("ä¿®æ¹æå", tasks); } catch (Exception ex) { return WebResponseContent.Instance.Error($"ä¿®æ¹å¤±è´¥: {ex.Message}"); } } /// <summary> /// æ¥æ¾æçæ¯å¦æä»»å¡ /// </summary> /// <param name="palletCode"></param> /// <returns></returns> private async Task<WebResponseContent> GetTaskByPalletCodeAsync(string palletCode) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == palletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var taskDto = _mapper.Map<WMSTaskDTO>(task); return WebResponseContent.Instance.OK("æ¥è¯¢æå", taskDto); } catch (Exception ex) { return WebResponseContent.Instance.Error($"æ¥è¯¢ä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// 宿任å¡åç»ä¸å¤çï¼å é¤ä»»å¡æ°æ®ï¼ /// </summary> private async Task<WebResponseContent> CompleteTaskAsync(Dt_Task task, string operateType = "") { var deleteTaskResult = await BaseDal.DeleteDataAsync(task); if (!deleteTaskResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); var historyTask = _mapper.Map<Dt_Task_Hty>(task); historyTask.InsertTime = DateTime.Now; historyTask.OperateType = operateType; var saveResult = await _task_HtyService.Repository.AddDataAsync(historyTask) > 0; if (!saveResult) return WebResponseContent.Instance.Error("ä»»å¡åå²ä¿å失败"); return WebResponseContent.Instance.OK("ä»»å¡å®æ"); } /// <summary> /// æ ¹æ®å··éç¡®å®ç®æ å°åï¼æ¯æå¤åºåºå£è½®è¯¢ï¼ /// </summary> private string DetermineTargetAddress(string roadway, Dictionary<string, List<string>> addressMap) { if (string.IsNullOrWhiteSpace(roadway)) return "10080"; // æ¥æ¾å¹é çå··éåç¼ string matchedPrefix = null; foreach (var kvp in addressMap) { if (roadway.Contains(kvp.Key)) { matchedPrefix = kvp.Key; break; } } if (matchedPrefix == null) return "10080"; var addresses = addressMap[matchedPrefix]; if (addresses == null || addresses.Count == 0) return "10080"; // å个å°åï¼ç´æ¥è¿å if (addresses.Count == 1) return addresses[0]; // å¤ä¸ªå°åï¼ä½¿ç¨è½®è¯¢æå¡ return _roundRobinService.GetNextAddress(matchedPrefix, addresses); } /// <summary> /// èªå¨å建åºåºä»»å¡ - æ¥è¯¢å°æåºåå¹¶åå»ºä»»å¡ /// </summary> public async Task<WebResponseContent> CreateAutoOutboundTasksAsync() { try { // 1. æ¥è¯¢å°æåºå var expiredStocks = await _stockInfoService.Repository .QueryDataNavAsync(s => s.OutboundDate <= DateTime.Now && s.StockStatus == StockStatusEmun.å ¥åºå®æ.GetHashCode()); if (expiredStocks == null || !expiredStocks.Any()) { return WebResponseContent.Instance.OK("æ å°æåºåéè¦å¤ç"); } // è¿æ»¤æä½ç½®ä¸ä½ç½®æåºåçè®°å½ expiredStocks = expiredStocks .Where(s => s.LocationDetails != null && s.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode()) .ToList(); if (!expiredStocks.Any()) { return WebResponseContent.Instance.OK("æ ç¬¦åæ¡ä»¶çå°æåºå"); } // 2. æ£æ¥å·²åå¨çä»»å¡ var palletCodes = expiredStocks.Select(s => s.PalletCode).ToList(); var existingTasks = await Repository.QueryDataAsync(t => palletCodes.Contains(t.PalletCode) && (t.TaskStatus == TaskStatusEnum.New.GetHashCode() || t.TaskStatus == TaskStatusEnum.SC_Executing.GetHashCode() || t.TaskStatus == TaskInStatusEnum.InNew.GetHashCode())); var processedPallets = existingTasks.Select(t => t.PalletCode).ToHashSet(); // 3. çééè¦å¤ççåºå var stocksToProcess = expiredStocks .Where(s => !processedPallets.Contains(s.PalletCode)) .ToList(); if (!stocksToProcess.Any()) { return WebResponseContent.Instance.OK("ææå°æåºåå·²åå¨ä»»å¡"); } // 4. è·åé ç½®çç®æ å°åæ å° var targetAddressMap = _configuration.GetSection("AutoOutboundTask:TargetAddresses") .Get<Dictionary<string, List<string>>>() ?? new Dictionary<string, List<string>>(); // 5. æ¹éåå»ºä»»å¡ var taskList = new List<Dt_Task>(); foreach (var stock in stocksToProcess) { // æ ¹æ®å··éç¡®å®ç®æ å°å var targetAddress = DetermineTargetAddress( stock.LocationDetails?.RoadwayNo ?? "", targetAddressMap); var task = new Dt_Task { WarehouseId = stock.WarehouseId, PalletCode = stock.PalletCode, PalletType = stock.PalletType, SourceAddress = stock.LocationCode, CurrentAddress = stock.LocationCode, NextAddress = targetAddress, TargetAddress = targetAddress, Roadway = stock.LocationDetails?.RoadwayNo ?? "", TaskType = TaskTypeEnum.Outbound.GetHashCode(), TaskStatus = TaskStatusEnum.New.GetHashCode(), Grade = 1, TaskNum = await BaseDal.GetTaskNo(), Creater = "system_auto" }; taskList.Add(task); } var transactionResult = await ExecuteWithinTransactionAsync(async () => { var addResult = await BaseDal.AddDataAsync(taskList) > 0; if (!addResult) { return WebResponseContent.Instance.Error($"æ¹éå建任å¡å¤±è´¥ï¼å ± {taskList.Count} 个任å¡"); } // ä»»å¡å建æååï¼åæ¥éå®åºååè´§ä½ç¶æï¼é¿å éå¤åé var stocksToUpdate = stocksToProcess .Select(s => { s.StockStatus = StockStatusEmun.åºåºéå®.GetHashCode(); return s; }) .ToList(); var updateStockResult = await _stockInfoService.Repository.UpdateDataAsync(stocksToUpdate); if (!updateStockResult) { return WebResponseContent.Instance.Error($"ä»»å¡å建æåï¼ä½åºåç¶ææ´æ°å¤±è´¥ï¼å ± {stocksToUpdate.Count} æ¡"); } var locationsToUpdate = stocksToProcess .Where(s => s.LocationDetails != null) .GroupBy(s => s.LocationDetails.Id) .Select(g => { var location = g.First().LocationDetails; location.LocationStatus = LocationStatusEnum.InStockLock.GetHashCode(); return location; }) .ToList(); if (locationsToUpdate.Any()) { var updateLocationResult = await _locationInfoService.Repository.UpdateDataAsync(locationsToUpdate); if (!updateLocationResult) { return WebResponseContent.Instance.Error($"ä»»å¡å建æåï¼ä½è´§ä½ç¶ææ´æ°å¤±è´¥ï¼å ± {locationsToUpdate.Count} æ¡"); } } return WebResponseContent.Instance.OK(); }); if (!transactionResult.Status) { return transactionResult; } // 6. éç¥ WCSï¼å¼æ¥ï¼ä¸å½±å主æµç¨ï¼ _ = Task.Run(() => { try { var wmstaskDtos = _mapper.Map<List<WMSTaskDTO>>(taskList); _httpClientHelper.Post<WebResponseContent>( "http://localhost:9292/api/Task/ReceiveTask", wmstaskDtos.ToJson()); } catch (Exception ex) { // WCS éç¥å¤±è´¥ä¸å½±åä»»å¡å建ï¼è®°å½æ¥å¿å³å¯ Console.WriteLine($"WCS æ¹ééç¥å¤±è´¥ï¼ä»»å¡æ°é: {taskList.Count}, é误: {ex.Message}"); } }); return WebResponseContent.Instance.OK($"æåå建 {taskList.Count} 个åºåºä»»å¡", taskList.Count); } catch (Exception ex) { return WebResponseContent.Instance.Error($"èªå¨å建åºåºä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// åå»ºæºæ¢°æç»çä»»å¡ /// </summary> public async Task<WebResponseContent> CreateRobotGroupPalletTaskAsync(StockDTO stock) { return await CreateRobotPalletTaskAsync( stock, "ç»ç", RobotTaskTypeEnum.GroupPallet, s => string.IsNullOrWhiteSpace(s.TargetPalletNo) ? s.SourcePalletNo : s.TargetPalletNo, requireStockWithoutLocation: false); } /// <summary> /// åå»ºæºæ¢°ææ¢çä»»å¡ /// </summary> public async Task<WebResponseContent> CreateRobotChangePalletTaskAsync(StockDTO stock) { return await CreateRobotPalletTaskAsync( stock, "æ¢ç", RobotTaskTypeEnum.ChangePallet, s => s.SourcePalletNo, requireStockWithoutLocation: true, stockPalletCodeSelector: s => s.SourcePalletNo); } /// <summary> /// åå»ºæºæ¢°ææçä»»å¡ /// </summary> public async Task<WebResponseContent> CreateRobotSplitPalletTaskAsync(StockDTO stock) { return await CreateRobotPalletTaskAsync( stock, "æç", RobotTaskTypeEnum.SplitPallet, s => s.SourcePalletNo, requireStockWithoutLocation: true, stockPalletCodeSelector: s => s.SourcePalletNo); } private async Task<WebResponseContent> CreateRobotPalletTaskAsync( StockDTO stock, string taskName, RobotTaskTypeEnum taskType, Func<StockDTO, string?> palletCodeSelector, bool requireStockWithoutLocation, Func<StockDTO, string?>? stockPalletCodeSelector = null) { try { if (stock == null) return WebResponseContent.Instance.Error("ä»»å¡åæ°ä¸è½ä¸ºç©º"); var palletCode = palletCodeSelector(stock)?.Trim(); if (string.IsNullOrWhiteSpace(palletCode)) return WebResponseContent.Instance.Error("æçå·ä¸è½ä¸ºç©º"); var sourceLineNo = stock.SourceLineNo?.Trim(); var targetLineNo = stock.TargetLineNo?.Trim(); if (string.IsNullOrWhiteSpace(sourceLineNo) || string.IsNullOrWhiteSpace(targetLineNo)) return WebResponseContent.Instance.Error("æ¥æºçº¿ä½ç¼å·åç®æ 线ä½ç¼å·ä¸è½ä¸ºç©º"); var existingTask = await BaseDal.QueryFirstAsync(t => t.PalletCode == palletCode && (t.TaskStatus == TaskRobotStatusEnum.RobotNew.GetHashCode() || t.TaskStatus == TaskRobotStatusEnum.RobotExecuting.GetHashCode() || t.TaskStatus == TaskRobotStatusEnum.RobotPickFinish.GetHashCode() || t.TaskStatus == TaskRobotStatusEnum.RobotPutFinish.GetHashCode() || t.TaskStatus == TaskRobotStatusEnum.RobotPending.GetHashCode())); if (existingTask != null) return WebResponseContent.Instance.Error($"æç[{palletCode}]å·²å卿ªå®æä»»å¡"); Dt_StockInfo? stockInfo = null; if (requireStockWithoutLocation) { var stockPalletCode = (stockPalletCodeSelector ?? palletCodeSelector).Invoke(stock)?.Trim(); if (string.IsNullOrWhiteSpace(stockPalletCode)) return WebResponseContent.Instance.Error("æºæçå·ä¸è½ä¸ºç©º"); stockInfo = await _stockInfoService.GetStockInfoAsync(stockPalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error($"æç[{stockPalletCode}]åºåä¸åå¨"); if (stockInfo.LocationId > 0 || !string.IsNullOrWhiteSpace(stockInfo.LocationCode)) return WebResponseContent.Instance.Error($"æç[{stockPalletCode}]åºåå·²ç»å®è´§ä½ï¼ä¸è½åå»ºæºæ¢°æ{taskName}ä»»å¡"); } var task = new Dt_Task { TaskNum = await BaseDal.GetTaskNo(), PalletCode = palletCode, PalletType = stockInfo?.PalletType ?? 0, Roadway = stock.Roadway, TaskType = taskType.GetHashCode(), TaskStatus = TaskRobotStatusEnum.RobotNew.GetHashCode(), SourceAddress = sourceLineNo, TargetAddress = targetLineNo, CurrentAddress = sourceLineNo, NextAddress = targetLineNo, WarehouseId = stockInfo?.WarehouseId ?? 1, Grade = 1, Remark = $"æºæ¢°æ{taskName}", Creater = "system" }; var result = await Repository.AddDataAsync(task) > 0; if (!result) return WebResponseContent.Instance.Error($"æºæ¢°æ{taskName}ä»»å¡å建失败"); var wmstaskDto = _mapper.Map<WMSTaskDTO>(task); return WebResponseContent.Instance.OK($"æºæ¢°æ{taskName}ä»»å¡å建æå", wmstaskDto); } catch (Exception ex) { return WebResponseContent.Instance.Error($"æºæ¢°æ{taskName}ä»»å¡å建失败: {ex.Message}"); } } #endregion WCSé»è¾å¤ç #region åå®¹ææ¥å£ /// <summary> /// å åæºåæ¾è´§å®æåç©æµéç¥åæå容æå®æä¿¡å· /// </summary> public async Task<WebResponseContent> InOrOutCompletedAsync(GradingMachineInputDto input) { WebResponseContent content = new WebResponseContent(); if (string.IsNullOrWhiteSpace(input.PalletCode) || string.IsNullOrWhiteSpace(input.LocationCode)) { return content.Error($"æçå·æè è´§ä½ç¼å·ä¸è½ä¸ºç©º"); } try { var stockInfo = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode); int locationStatus; if (stockInfo == null) { var location = await _locationInfoService.GetLocationInfoAsync(input.LocationCode); locationStatus = location?.LocationStatus ?? 0; } else { locationStatus = stockInfo.LocationDetails?.LocationStatus ?? 0; } OutputDto outPutDto = new OutputDto() { LocationCode = input.LocationCode, PalletCode = input.PalletCode, IsNormalProcedure = 1, LocationStatus = locationStatus }; return content.OK(data: outPutDto); } catch (Exception ex) { content.Error(ex.Message); } return content; } /// <summary> /// åæå容æå®æ¶åç©æµæ´æ°å容æç¶æä¿¡æ¯ /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<WebResponseContent> SendLocationStatusAsync(GradingMachineInputDto input) { WebResponseContent content = new WebResponseContent(); if (string.IsNullOrWhiteSpace(input.LocationCode)) { return content.Error($"è´§ä½ç¼å·ä¸è½ä¸ºç©º"); } try { var result = await _locationInfoService.Db.Updateable<Dt_LocationInfo>() .SetColumns(s => new Dt_LocationInfo { LocationStatus = input.LocationStatus }).Where(s => s.LocationCode == input.LocationCode).ExecuteCommandAsync() > 0; if (result) { content.OK("æ´æ°æå"); } else { content.Error("æ´æ°å¤±è´¥"); } } catch (Exception ex) { content.Error(ex.Message); } return content; } /// <summary> /// å容æå·¥ä½å®æåè°ç¨æ¤æ¥å£éç¥ç©æµåºåº /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<WebResponseContent> RequestOutboundAsync(GradingMachineInputDto input) { WebResponseContent content = new WebResponseContent(); if (string.IsNullOrWhiteSpace(input.LocationCode) || string.IsNullOrWhiteSpace(input.PalletCode)) { return content.Error($"æçå·æè è´§ä½ç¼å·ä¸è½ä¸ºç©º"); } try { var stock = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode); if (stock == null) { content.Error("æªæ¾å°å¯¹åºçæç"); } else { var taskList = new Dt_Task { WarehouseId = stock.WarehouseId, PalletCode = stock.PalletCode, PalletType = stock.PalletType, SourceAddress = stock.LocationCode, CurrentAddress = stock.LocationCode, NextAddress = "10080", TargetAddress = "10081", Roadway = stock.LocationDetails.RoadwayNo, TaskType = TaskTypeEnum.Outbound.GetHashCode(), TaskStatus = TaskStatusEnum.New.GetHashCode(), Grade = 1, TaskNum = await BaseDal.GetTaskNo(), Creater = "system", }; var result = await BaseDal.AddDataAsync(taskList) > 0; var wmstaskDto = result ? _mapper.Map<WMSTaskDTO>(taskList) : null; var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://logistics-service/api/logistics/notifyoutbound", JsonSerializer.Serialize(wmstaskDto)).Data; if (result && httpResponse != null) { content.OK("åºåºè¯·æ±æå"); } else { content.Error("åºåºè¯·æ±å¤±è´¥"); } } } catch (Exception ex) { content.Error(ex.Message); } return content; } /// <summary> /// å ¥åºå®æå容è°ç¨è·åæç䏿¯ä¸ªééçµè¯ /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<WebResponseContent> GetPalletCodeCellAsync(GradingMachineInputDto input) { WebResponseContent content = new WebResponseContent(); if (string.IsNullOrWhiteSpace(input.PalletCode) || string.IsNullOrWhiteSpace(input.LocationCode)) { return content.Error($"æçå·æè è´§ä½ç¼å·ä¸è½ä¸ºç©º"); } try { var stockInfo = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode); if (stockInfo == null) { return content.Error("æªæ¾å°å¯¹åºçæç"); } var outPutDtos = stockInfo.Details.Select(x => new OutputDto() { LocationCode = input.LocationCode, PalletCode = input.PalletCode, IsNormalProcedure = 1, LocationStatus = stockInfo.LocationDetails.LocationStatus, CellCode = x.SerialNumber, Channel = x.InboundOrderRowNo.ToString() }).ToList(); return content.OK(data: outPutDtos); } catch (Exception ex) { return content.Error(ex.Message); } } #endregion åå®¹ææ¥å£ #region æå·åºä»»å¡æ¨¡å public string AGV_OutTaskComplete = WIDESEA_Core.Helper.AppSettings.Configuration["AGV_OutTaskComplete"]; // 䏿¥AGVåºåºè¾éçº¿å®æ public string WCS_ReceiveTask = WIDESEA_Core.Helper.AppSettings.Configuration["WCS_ReceiveTask"]; // WMSè¾é线任å¡ä¸å /// <summary> /// åºå ¥åºç³è¯· /// </summary> /// <param name="applyInOutDto">请æ±åæ°</param> /// <returns></returns> public async Task<AGVResponse> ApplyInOutAsync(ApplyInOutDto applyInOutDto) { AGVResponse aGVResponse = new AGVResponse(); try { // åæ°éªè¯ if (applyInOutDto == null) return aGVResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.TrayNumber)) return aGVResponse.Error("æçå·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.TaskId)) return aGVResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.MaterialType)) return aGVResponse.Error("ç©æç±»åä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.MaterialName)) return aGVResponse.Error("ç©ææè¿°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.ReqTime)) return aGVResponse.Error("è¯·æ±æ¶é´ä¸è½ä¸ºç©º"); if (applyInOutDto.Floor != 1 && applyInOutDto.Floor != 2) return aGVResponse.Error($"æ¥¼å±æ®µé误ï¼å¿ 须为1(æ¨¡åæ®µ)æ2(å·ç»æ®µ)ï¼å½åå¼ï¼{applyInOutDto.Floor}"); if (applyInOutDto.YinYang != 1 && applyInOutDto.YinYang != 2) return aGVResponse.Error($"é´é³æé误ï¼å¿ 须为1(é´æ)æ2(鳿)ï¼å½åå¼ï¼{applyInOutDto.YinYang}"); if (applyInOutDto.InOut != 1 && applyInOutDto.InOut != 2) return aGVResponse.Error($"åºå ¥åºç±»åé误ï¼å¿ 须为1(å ¥åº)æ2(åºåº)ï¼å½åå¼ï¼{applyInOutDto.InOut}"); if (applyInOutDto.InOut == 1) // å ¥åº { if (applyInOutDto.Width == null || applyInOutDto.Width <= 0) return aGVResponse.Error("å ¥åºæ¶å®½åº¦ä¸è½ä¸ºç©ºä¸å¿ 须大äº0"); if (string.IsNullOrWhiteSpace(applyInOutDto.Group)) return aGVResponse.Error("å ¥åºæ¶æ´æç»å«ä¸è½ä¸ºç©º"); } // æ£æ¥ä»»å¡æ¯å¦å·²åå¨ var existingTask = await BaseDal.QueryFirstAsync(x => x.PalletCode == applyInOutDto.TrayNumber); if (existingTask != null) return aGVResponse.Error($"WMSå·²æå½åä»»å¡ï¼ä¸å¯éå¤ä¸åï¼ä»»å¡å·ï¼{applyInOutDto.TaskId}"); // åå»ºä»»å¡ Dt_Task task = new Dt_Task { OrderNo = applyInOutDto.TaskId, // 使ç¨AGVçä»»å¡å· PalletCode = applyInOutDto.TrayNumber, PalletType = applyInOutDto.Floor, //WarehouseId = applyInOutDto.YinYang, Grade = 1, Creater = "AGV", CreateDate = DateTime.Now, Remark = $"ç©æç±»åï¼{applyInOutDto.MaterialType}ï¼ç©ææè¿°ï¼{applyInOutDto.MaterialName}" }; // æ ¹æ®é´æ/é³æè®¾ç½®å··éåç«å° if (applyInOutDto.YinYang == 1) // é´æ { // è´§ç©å°è¾¾ååé è´§ç©ä½ task.Roadway = WarehouseEnum.FJ1.ToString(); task.WarehouseId = (int)WarehouseEnum.FJ1; task.SourceAddress = applyInOutDto.InOut == 1 ? "D10010" : "D10020"; // å ¥åºå£/åºåºå£ task.NextAddress = "D10080"; // é´æå ¬å ±åºåºå£ task.TargetAddress = "é´æå·åº"; } else if (applyInOutDto.YinYang == 2) // 鳿 { task.Roadway = WarehouseEnum.ZJ1.ToString(); task.WarehouseId = (int)WarehouseEnum.ZJ1; task.SourceAddress = applyInOutDto.InOut == 1 ? "D10100" : "D10090"; // å ¥åºå£/åºåºå£ task.NextAddress = "D10160"; // é³æå ¬å ±åºåºå£ task.TargetAddress = "æ£æå·åº"; } // æ ¹æ®åºå ¥åºç±»åè®¾ç½®ç®æ å°å if (applyInOutDto.InOut == 1) // å ¥åº { var stockInfo = await _stockInfoService.GetStockInfoAsync(applyInOutDto.TrayNumber); if (stockInfo != null) return aGVResponse.Error($"å½åæç{applyInOutDto.TrayNumber}å·²ç»å ¥åºäº"); task.TaskType = (int)TaskInboundTypeEnum.Inbound; task.TaskStatus = (int)TaskInStatusEnum.InNew; task.CurrentAddress = task.SourceAddress; // å½åå¨å ¥åºå£ // ä¿åä»»å¡ var result = await BaseDal.AddDataAsync(task); } else // åºåº { // 夿æ¯å¦ç§»åº task.TaskType = (int)TaskOutboundTypeEnum.Outbound; task.TaskStatus = (int)TaskOutStatusEnum.OutNew; task.CurrentAddress = task.SourceAddress; // å½åå¨å ¥åºå£ // æ¥æ¾åºå var stockInfo = await _stockInfoService.GetStockInfoAsync(applyInOutDto.TrayNumber); if (stockInfo == null) return aGVResponse.Error($"æªæ¾å°æç{applyInOutDto.TrayNumber}çåºåä¿¡æ¯"); // éªè¯åºåæå±æ¯å¦æ£ç¡® if (stockInfo.WarehouseId != applyInOutDto.YinYang) return aGVResponse.Error($"æç{applyInOutDto.TrayNumber}ä¸å±äºå½å{(applyInOutDto.YinYang == 1 ? "é´æ" : "鳿")}"); if (stockInfo.StockStatus != (int)StockStatusEmun.å ¥åºå®æ) return aGVResponse.Error($"æç{applyInOutDto.TrayNumber}æ£å¨ç§»å¨ä¸ï¼è¯·ç¨åï¼"); task.SourceAddress = stockInfo.LocationCode; // æºå°åä¸ºè´§ä½ task.CurrentAddress = stockInfo.LocationCode; // å½åä½ç½®å¨è´§ä½ task.TargetAddress = applyInOutDto.YinYang == 1 ? "D10020" : "D10090"; // ç®æ å°å为åºåºå£ // ä¿åä»»å¡ var result = await BaseDal.AddDataAsync(task); // 夿æ¯å¦ç§»åº //var transferTask = await _locationInfoService.TransferCheckAsync(result); } // æå»ºååºæ°æ® AGVDataDto aGVDataDto = new AGVDataDto { DevId = applyInOutDto.InOut == 1 ? task.SourceAddress : task.TargetAddress, TrayNumber = task.PalletCode, Group = applyInOutDto.Group, Width = applyInOutDto.Width ?? 0, LabelNumber = applyInOutDto.LabelNumber, ProductNo = applyInOutDto.ProductNo, ProductName = applyInOutDto.ProductName, Quantity = applyInOutDto.Quantity, UomCode = applyInOutDto.UomCode, ProductType = applyInOutDto.ProductType, Equipment = applyInOutDto.Equipment, ProductionDate = applyInOutDto.ProductionDate, LowerLimitTime = applyInOutDto.LowerLimitTime, WarningTime = applyInOutDto.WarningTime, OverdueTime = applyInOutDto.OverdueTime }; return aGVResponse.OK(aGVDataDto); } catch (Exception ex) { return aGVResponse.Error($"WMSä»»å¡å建æ¥å£é误: {ex.Message}"); } } /// <summary> /// æå¨åºåºå®æåé¦ç»AGV /// </summary> /// <param name="outTaskCompleteDto">请æ±åæ°</param> /// <returns></returns> public async Task<WebResponseContent> OutTaskComplete(OutTaskCompleteDto outTaskCompleteDto) { WebResponseContent webResponse = new WebResponseContent(); try { if (outTaskCompleteDto == null) return webResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(outTaskCompleteDto.TaskId)) return webResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(outTaskCompleteDto.DevId)) return webResponse.Error("åºåºå£ç¼å·ä¸è½ä¸ºç©º"); var task = await BaseDal.QueryFirstAsync(x => x.OrderNo == outTaskCompleteDto.TaskId); if (task == null) return webResponse.Error("æªæ¾å°ä»»å¡ä¿¡æ¯"); outTaskCompleteDto.ReqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var httpResponse = _httpClientHelper.Post<AGVResponse>(AGV_OutTaskComplete, outTaskCompleteDto.ToJson()).Data; // 夿è¿ç¨æ¥å£è¿åæ¯å¦æå if (httpResponse != null && httpResponse.Data != null) { AGVResponse agvResponse = httpResponse; // æ ¹æ®codeåæ®µå¤æï¼code为true表示æå if (agvResponse.Code == true) { var stockInfo = await _stockInfoService.GetStockInfoAsync(task.PalletCode); if (stockInfo == null) return webResponse.Error($"æªæ¾å°æç{task.PalletCode}çåºåä¿¡æ¯"); var locationInfo = await _locationInfoService.GetLocationInfoAsync(stockInfo.LocationCode); if (locationInfo == null) return webResponse.Error($"æªæ¾å°æç{stockInfo.LocationCode}çè´§ä½ä¿¡æ¯"); if (stockInfo.StockStatus != (int)StockStatusEmun.åºåºéå® || locationInfo.LocationStatus != (int)LocationStatusEnum.InStockLock) { return webResponse.Error($"å½ååºå{stockInfo.StockStatus}æè è´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); } locationInfo.LocationStatus = (int)LocationStatusEnum.Free; _unitOfWorkManage.BeginTran(); BaseDal.DeleteData(task); _locationInfoService.UpdateData(locationInfo); _stockInfoService.DeleteData(stockInfo); _unitOfWorkManage.CommitTran(); return webResponse.OK(agvResponse.Msg); } else { // 失败ï¼è¿åAGVè¿åçéè¯¯ä¿¡æ¯ return webResponse.Error(string.IsNullOrWhiteSpace(agvResponse.Msg) ? "AGVæ¥å£è°ç¨å¤±è´¥" : agvResponse.Msg); } } else { // HTTPè¯·æ±æ¬èº«å¤±è´¥ return webResponse.Error(httpResponse?.Msg ?? "AGVæ¥å£è°ç¨å¼å¸¸"); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return webResponse.Error($"WMSä»»å¡å®ææ¥å£é误ï¼{ex.Message}"); } } ///// <summary> ///// ä»»å¡å®ææ¥å£ ///// </summary> ///// <param name="wCSTask"></param> ///// <returns></returns> //public async Task<WebResponseContent> TaskCompleted(WCSTaskDTO wCSTask) //{ // WebResponseContent webResponse = new WebResponseContent(); // try // { // Dt_Task task = await BaseDal.QueryFirstAsync(x => x.TaskId == wCSTask.TaskNum && x.PalletCode == wCSTask.PalletCode); // if (task == null) return webResponse.Error("æªæ¾å°ä»»å¡ä¿¡æ¯"); // // åºåºå®æåé¦ // OutTaskCompleteDto outTaskCompleteDto = new OutTaskCompleteDto() // { // TaskId = task.OrderNo, // DevId = task.TargetAddress, // ReqTime = DateTime.Now.ToString() // }; // return await OutTaskComplete(outTaskCompleteDto); // } // catch (Exception ex) // { // return webResponse.Error($"WMSä»»å¡å®ææ¥å£é误ï¼{ex.Message}"); // } //} /// <summary> /// è¾é线ç³è¯·è¿å ¥ /// </summary> /// <param name="applyEnterDto">请æ±åæ°</param> /// <returns></returns> public async Task<AGVResponse> ApplyEnterAsync(ApplyEnterDto applyEnterDto) { AGVResponse aGVResponse = new AGVResponse(); try { // åæ°éªè¯ if (applyEnterDto == null) return aGVResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyEnterDto.DevId)) return aGVResponse.Error("设å¤ç¼å·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyEnterDto.TaskId)) return aGVResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); if (applyEnterDto.InOut != 1 && applyEnterDto.InOut != 2) return aGVResponse.Error($"åºå ¥åºç±»åé误ï¼å¿ 须为1(å ¥åº)æ2(åºåº)ï¼å½åå¼ï¼{applyEnterDto.InOut}"); // æ¥è¯¢ä»»å¡æ¯å¦åå¨ var task = await BaseDal.QueryFirstAsync(x => x.OrderNo == applyEnterDto.TaskId); if (task == null) return aGVResponse.Error($"æªæ¾å°ä»»å¡ä¿¡æ¯ï¼ä»»å¡å·ï¼{applyEnterDto.TaskId}"); if (applyEnterDto.InOut == 1 && task.TaskType == (int)TaskInboundTypeEnum.Inbound && task.TaskStatus == (int)TaskInStatusEnum.InNew) { aGVResponse.OK(); } else if (applyEnterDto.InOut == 2 && task.TaskType == (int)TaskOutboundTypeEnum.Outbound && task.TaskStatus == (int)TaskStatusEnum.Line_Finish) { aGVResponse.OK(); } return aGVResponse.Error($"è¾é线{applyEnterDto.DevId}å½åç¹å¿ï¼è¯·ç¨åéè¯"); // Dt_Task.SourceAddress询é®wcsç«å°1-é´æå ¥å£å«D10010åD10020ï¼2-鳿D10090åD10100æ¯å¦æè´§ç© //var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://127.0.0.1:9999/api/Task/ApplyInOut", JsonSerializer.Serialize(task)).Data; //if (httpResponse != null && httpResponse.Status == true) //{ // _unitOfWorkManage.BeginTran(); // task.TaskStatus = (int)TaskStatusEnum.AGV_Executing; // await BaseDal.UpdateDataAsync(task); // _unitOfWorkManage.CommitTran(); // return aGVResponse.OK(); //} //else //{ // return aGVResponse.Error($"ç«å°{task.SourceAddress}å·²ç»è½½è´§"); //} } catch (Exception ex) { //_unitOfWorkManage.RollbackTran(); return aGVResponse.Error($"WMSè¾é线ç³è¯·æ¥å£é误ï¼{ex.Message}"); } } /// <summary> /// åæ¾è´§å®æ /// </summary> /// <param name="taskCompleteDto">请æ±åæ°</param> /// <returns></returns> public async Task<AGVResponse> TaskCompleteAsync(TaskCompleteDto taskCompleteDto) { AGVResponse aGVResponse = new AGVResponse(); try { if (taskCompleteDto == null) return aGVResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(taskCompleteDto.TaskId)) return aGVResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(taskCompleteDto.DevId)) return aGVResponse.Error("设å¤ç¼å·ä¸è½ä¸ºç©º"); if (taskCompleteDto.InOut != 1 && taskCompleteDto.InOut != 2) return aGVResponse.Error($"åºå ¥åºç±»åé误ï¼å¿ 须为1(å ¥åº)æ2(åºåº)ï¼å½åå¼ï¼{taskCompleteDto.InOut}"); var task = await BaseDal.QueryFirstAsync(x => x.OrderNo == taskCompleteDto.TaskId); if (task == null) return aGVResponse.Error($"æªæ¾å°ä»»å¡ä¿¡æ¯ï¼ä»»å¡å·ï¼{taskCompleteDto.TaskId}"); if (taskCompleteDto.InOut == 2) { var stockInfo = await _stockInfoService.GetStockInfoAsync(task.PalletCode); if (stockInfo == null) return aGVResponse.Error($"æªæ¾å°æç{task.PalletCode}çåºåä¿¡æ¯"); var locationInfo = await _locationInfoService.GetLocationInfoAsync(stockInfo.LocationCode); if (locationInfo == null) return aGVResponse.Error($"æªæ¾å°æç{stockInfo.LocationCode}çè´§ä½ä¿¡æ¯"); if (stockInfo.StockStatus != (int)StockStatusEmun.åºåºéå® || locationInfo.LocationStatus != (int)LocationStatusEnum.InStockLock) { return aGVResponse.Error($"å½ååºå{stockInfo.StockStatus}æè è´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); } locationInfo.LocationStatus = (int)LocationStatusEnum.Free; task.TaskStatus = (int)TaskOutStatusEnum.OutFinish; _unitOfWorkManage.BeginTran(); _stockInfoService.DeleteData(stockInfo); await _locationInfoService.UpdateLocationInfoAsync(locationInfo); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); _unitOfWorkManage.CommitTran(); } else { //æ¥æ¾å¯ç¨è´§ä½ var availableLocation = await _locationInfoService.GetLocationInfo(task.Roadway); if (availableLocation == null) return aGVResponse.Error("æ å¯ç¨çå ¥åºè´§ä½"); task.TargetAddress = availableLocation.LocationCode; // éç¥WCSå ¥åº var wcsTaskDto = _mapper.Map<WCSTaskDTO>(task); var httpResponse = _httpClientHelper.Post<WebResponseContent>(WCS_ReceiveTask, JsonSerializer.Serialize(wcsTaskDto)); if (httpResponse == null) return aGVResponse.Error("ä¸åWCS失败"); task.TaskStatus = (int)TaskStatusEnum.Line_Executing; task.Dispatchertime = DateTime.Now; var locationInfo = await _locationInfoService.GetLocationInfoAsync(task.TargetAddress); if (locationInfo == null) return aGVResponse.Error($"æªæ¾å°æç{task.TargetAddress}çè´§ä½ä¿¡æ¯"); if (locationInfo.LocationStatus != (int)LocationStatusEnum.InStock) { return aGVResponse.Error($"å½åè´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); } Dt_StockInfo dt_Stock = new Dt_StockInfo() { PalletCode = task.PalletCode, StockStatus = (int)StockStatusEmun.å ¥åºç¡®è®¤, LocationCode = locationInfo.LocationCode, WarehouseId = task.WarehouseId, Creater = "AGV", CreateDate = DateTime.Now }; locationInfo.LocationStatus = (int)LocationStatusEnum.FreeLock; _unitOfWorkManage.BeginTran(); BaseDal.UpdateData(task); _locationInfoService.UpdateData(locationInfo); _stockInfoService.AddData(dt_Stock); _unitOfWorkManage.CommitTran(); } return aGVResponse.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return aGVResponse.Error($"WMSåæ¾è´§å®ææ¥å£é误ï¼{ex.Message}"); } } /// <summary> /// ä»»å¡åæ¶ /// </summary> /// <param name="taskCancelDto">请æ±åæ°</param> /// <returns></returns> public async Task<AGVResponse> TaskCancelAsync(TaskCancelDto taskCancelDto) { AGVResponse aGVResponse = new AGVResponse(); try { if (taskCancelDto == null) return aGVResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(taskCancelDto.TaskId)) return aGVResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); var task = await BaseDal.QueryFirstAsync(x => x.OrderNo == taskCancelDto.TaskId); // 没æä»»å¡å¼ºå¶åæ¶ if (task == null) return aGVResponse.OK(); if (task.TaskStatus == (int)TaskInStatusEnum.InNew) { task.TaskStatus = (int)TaskInStatusEnum.InCancel; // å ¥åºä»»å¡ç´æ¥å é¤ _unitOfWorkManage.BeginTran(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); _unitOfWorkManage.CommitTran(); return aGVResponse.OK(); } else if (task.TaskStatus == (int)TaskOutStatusEnum.OutNew) { // åºåºä»»å¡æ¢å¤åºå var stockInfo = await _stockInfoService.GetStockInfoAsync(task.PalletCode); if (stockInfo == null) return aGVResponse.Error($"æªæ¾å°æç{task.PalletCode}çåºåä¿¡æ¯"); var locationInfo = await _locationInfoService.GetLocationInfoAsync(stockInfo.LocationCode); if (locationInfo == null) return aGVResponse.Error($"æªæ¾å°æç{stockInfo.LocationCode}çè´§ä½ä¿¡æ¯"); if (stockInfo.StockStatus != (int)StockStatusEmun.åºåºéå® || locationInfo.LocationStatus != (int)LocationStatusEnum.InStockLock) { return aGVResponse.Error($"å½ååºå{stockInfo.StockStatus}æè è´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); } stockInfo.StockStatus = (int)StockStatusEmun.å ¥åºå®æ; locationInfo.LocationStatus = (int)LocationStatusEnum.InStock; task.TaskStatus = (int)TaskOutStatusEnum.OutCancel; _unitOfWorkManage.BeginTran(); _locationInfoService.UpdateData(locationInfo); _stockInfoService.UpdateData(stockInfo); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); _unitOfWorkManage.CommitTran(); return aGVResponse.OK(); } return aGVResponse.Error("ä»»å¡å·²ç»å¨æ§è¡ä¸ï¼ä¸å¯åæ¶"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return aGVResponse.Error($"WMSä»»å¡åæ¶æ¥å£é误ï¼{ex.Message}"); } } #endregion æå·åºä»»å¡æ¨¡å } } Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_AGV.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,431 @@ using Mapster; using MapsterMapper; using Microsoft.Extensions.Configuration; using SqlSugar; using System.DirectoryServices.Protocols; using System.Text.Json; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Core; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.GradingMachine; using WIDESEA_DTO.MES; using WIDESEA_DTO.Stock; using WIDESEA_DTO.Task; using WIDESEA_IBasicService; using WIDESEA_IStockService; using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; namespace WIDESEA_TaskInfoService { public partial class TaskService { #region æå·åºä»»å¡æ¨¡å public string AGV_OutTaskComplete = WIDESEA_Core.Helper.AppSettings.Configuration["AGV_OutTaskComplete"]; // 䏿¥AGVåºåºè¾éçº¿å®æ public string WCS_ReceiveTask = WIDESEA_Core.Helper.AppSettings.Configuration["WCS_ReceiveTask"]; // WMSè¾é线任å¡ä¸å /// <summary> /// åºå ¥åºç³è¯· /// </summary> /// <param name="applyInOutDto">请æ±åæ°</param> /// <returns></returns> public async Task<AGVResponse> ApplyInOutAsync(ApplyInOutDto applyInOutDto) { AGVResponse aGVResponse = new AGVResponse(); try { // åæ°éªè¯ if (applyInOutDto == null) return aGVResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.TrayNumber)) return aGVResponse.Error("æçå·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.TaskId)) return aGVResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.MaterialType)) return aGVResponse.Error("ç©æç±»åä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.MaterialName)) return aGVResponse.Error("ç©ææè¿°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyInOutDto.ReqTime)) return aGVResponse.Error("è¯·æ±æ¶é´ä¸è½ä¸ºç©º"); if (applyInOutDto.Floor != 1 && applyInOutDto.Floor != 2) return aGVResponse.Error($"æ¥¼å±æ®µé误ï¼å¿ 须为1(æ¨¡åæ®µ)æ2(å·ç»æ®µ)ï¼å½åå¼ï¼{applyInOutDto.Floor}"); if (applyInOutDto.YinYang != 1 && applyInOutDto.YinYang != 2) return aGVResponse.Error($"é´é³æé误ï¼å¿ 须为1(é´æ)æ2(鳿)ï¼å½åå¼ï¼{applyInOutDto.YinYang}"); if (applyInOutDto.InOut != 1 && applyInOutDto.InOut != 2) return aGVResponse.Error($"åºå ¥åºç±»åé误ï¼å¿ 须为1(å ¥åº)æ2(åºåº)ï¼å½åå¼ï¼{applyInOutDto.InOut}"); if (applyInOutDto.InOut == 1) // å ¥åº { if (applyInOutDto.Width == null || applyInOutDto.Width <= 0) return aGVResponse.Error("å ¥åºæ¶å®½åº¦ä¸è½ä¸ºç©ºä¸å¿ 须大äº0"); if (string.IsNullOrWhiteSpace(applyInOutDto.Group)) return aGVResponse.Error("å ¥åºæ¶æ´æç»å«ä¸è½ä¸ºç©º"); } // æ£æ¥ä»»å¡æ¯å¦å·²åå¨ var existingTask = await BaseDal.QueryFirstAsync(x => x.PalletCode == applyInOutDto.TrayNumber); if (existingTask != null) return aGVResponse.Error($"WMSå·²æå½åä»»å¡ï¼ä¸å¯éå¤ä¸åï¼ä»»å¡å·ï¼{applyInOutDto.TaskId}"); // åå»ºä»»å¡ Dt_Task task = new Dt_Task { OrderNo = applyInOutDto.TaskId, // 使ç¨AGVçä»»å¡å· PalletCode = applyInOutDto.TrayNumber, PalletType = applyInOutDto.Floor, //WarehouseId = applyInOutDto.YinYang, Grade = 1, Creater = "AGV", CreateDate = DateTime.Now, Remark = $"ç©æç±»åï¼{applyInOutDto.MaterialType}ï¼ç©ææè¿°ï¼{applyInOutDto.MaterialName}" }; // æ ¹æ®é´æ/é³æè®¾ç½®å··éåç«å° if (applyInOutDto.YinYang == 1) // é´æ { // è´§ç©å°è¾¾ååé è´§ç©ä½ task.Roadway = WarehouseEnum.FJ1.ToString(); task.WarehouseId = (int)WarehouseEnum.FJ1; task.SourceAddress = applyInOutDto.InOut == 1 ? "D10010" : "D10020"; // å ¥åºå£/åºåºå£ task.NextAddress = "D10080"; // é´æå ¬å ±åºåºå£ task.TargetAddress = "é´æå·åº"; } else if (applyInOutDto.YinYang == 2) // 鳿 { task.Roadway = WarehouseEnum.ZJ1.ToString(); task.WarehouseId = (int)WarehouseEnum.ZJ1; task.SourceAddress = applyInOutDto.InOut == 1 ? "D10100" : "D10090"; // å ¥åºå£/åºåºå£ task.NextAddress = "D10160"; // é³æå ¬å ±åºåºå£ task.TargetAddress = "æ£æå·åº"; } // æ ¹æ®åºå ¥åºç±»åè®¾ç½®ç®æ å°å if (applyInOutDto.InOut == 1) // å ¥åº { var stockInfo = await _stockInfoService.GetStockInfoAsync(applyInOutDto.TrayNumber); if (stockInfo != null) return aGVResponse.Error($"å½åæç{applyInOutDto.TrayNumber}å·²ç»å ¥åºäº"); task.TaskType = (int)TaskInboundTypeEnum.Inbound; task.TaskStatus = (int)TaskInStatusEnum.InNew; task.CurrentAddress = task.SourceAddress; // å½åå¨å ¥åºå£ // ä¿åä»»å¡ var result = await BaseDal.AddDataAsync(task); } else // åºåº { // 夿æ¯å¦ç§»åº task.TaskType = (int)TaskOutboundTypeEnum.Outbound; task.TaskStatus = (int)TaskOutStatusEnum.OutNew; task.CurrentAddress = task.SourceAddress; // å½åå¨å ¥åºå£ // æ¥æ¾åºå var stockInfo = await _stockInfoService.GetStockInfoAsync(applyInOutDto.TrayNumber); if (stockInfo == null) return aGVResponse.Error($"æªæ¾å°æç{applyInOutDto.TrayNumber}çåºåä¿¡æ¯"); // éªè¯åºåæå±æ¯å¦æ£ç¡® if (stockInfo.WarehouseId != applyInOutDto.YinYang) return aGVResponse.Error($"æç{applyInOutDto.TrayNumber}ä¸å±äºå½å{(applyInOutDto.YinYang == 1 ? "é´æ" : "鳿")}"); if (stockInfo.StockStatus != (int)StockStatusEmun.å ¥åºå®æ) return aGVResponse.Error($"æç{applyInOutDto.TrayNumber}æ£å¨ç§»å¨ä¸ï¼è¯·ç¨åï¼"); task.SourceAddress = stockInfo.LocationCode; // æºå°åä¸ºè´§ä½ task.CurrentAddress = stockInfo.LocationCode; // å½åä½ç½®å¨è´§ä½ task.TargetAddress = applyInOutDto.YinYang == 1 ? "D10020" : "D10090"; // ç®æ å°å为åºåºå£ // ä¿åä»»å¡ var result = await BaseDal.AddDataAsync(task); // 夿æ¯å¦ç§»åº //var transferTask = await _locationInfoService.TransferCheckAsync(result); } // æå»ºååºæ°æ® AGVDataDto aGVDataDto = new AGVDataDto { DevId = applyInOutDto.InOut == 1 ? task.SourceAddress : task.TargetAddress, TrayNumber = task.PalletCode, Group = applyInOutDto.Group, Width = applyInOutDto.Width ?? 0, LabelNumber = applyInOutDto.LabelNumber, ProductNo = applyInOutDto.ProductNo, ProductName = applyInOutDto.ProductName, Quantity = applyInOutDto.Quantity, UomCode = applyInOutDto.UomCode, ProductType = applyInOutDto.ProductType, Equipment = applyInOutDto.Equipment, ProductionDate = applyInOutDto.ProductionDate, LowerLimitTime = applyInOutDto.LowerLimitTime, WarningTime = applyInOutDto.WarningTime, OverdueTime = applyInOutDto.OverdueTime }; return aGVResponse.OK(aGVDataDto); } catch (Exception ex) { return aGVResponse.Error($"WMSä»»å¡å建æ¥å£é误: {ex.Message}"); } } /// <summary> /// æå¨åºåºå®æåé¦ç»AGV /// </summary> /// <param name="outTaskCompleteDto">请æ±åæ°</param> /// <returns></returns> public async Task<WebResponseContent> OutTaskComplete(OutTaskCompleteDto outTaskCompleteDto) { WebResponseContent webResponse = new WebResponseContent(); try { if (outTaskCompleteDto == null) return webResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(outTaskCompleteDto.TaskId)) return webResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(outTaskCompleteDto.DevId)) return webResponse.Error("åºåºå£ç¼å·ä¸è½ä¸ºç©º"); var task = await BaseDal.QueryFirstAsync(x => x.OrderNo == outTaskCompleteDto.TaskId); if (task == null) return webResponse.Error("æªæ¾å°ä»»å¡ä¿¡æ¯"); outTaskCompleteDto.ReqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); var httpResponse = _httpClientHelper.Post<AGVResponse>(AGV_OutTaskComplete, outTaskCompleteDto.ToJson()).Data; // 夿è¿ç¨æ¥å£è¿åæ¯å¦æå if (httpResponse != null && httpResponse.Data != null) { AGVResponse agvResponse = httpResponse; // æ ¹æ®codeåæ®µå¤æï¼code为true表示æå if (agvResponse.Code == true) { var stockInfo = await _stockInfoService.GetStockInfoAsync(task.PalletCode); if (stockInfo == null) return webResponse.Error($"æªæ¾å°æç{task.PalletCode}çåºåä¿¡æ¯"); var locationInfo = await _locationInfoService.GetLocationInfoAsync(stockInfo.LocationCode); if (locationInfo == null) return webResponse.Error($"æªæ¾å°æç{stockInfo.LocationCode}çè´§ä½ä¿¡æ¯"); if (stockInfo.StockStatus != (int)StockStatusEmun.åºåºéå® || locationInfo.LocationStatus != (int)LocationStatusEnum.InStockLock) { return webResponse.Error($"å½ååºå{stockInfo.StockStatus}æè è´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); } locationInfo.LocationStatus = (int)LocationStatusEnum.Free; _unitOfWorkManage.BeginTran(); BaseDal.DeleteData(task); _locationInfoService.UpdateData(locationInfo); _stockInfoService.DeleteData(stockInfo); _unitOfWorkManage.CommitTran(); return webResponse.OK(agvResponse.Msg); } else { // 失败ï¼è¿åAGVè¿åçéè¯¯ä¿¡æ¯ return webResponse.Error(string.IsNullOrWhiteSpace(agvResponse.Msg) ? "AGVæ¥å£è°ç¨å¤±è´¥" : agvResponse.Msg); } } else { // HTTPè¯·æ±æ¬èº«å¤±è´¥ return webResponse.Error(httpResponse?.Msg ?? "AGVæ¥å£è°ç¨å¼å¸¸"); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return webResponse.Error($"WMSä»»å¡å®ææ¥å£é误ï¼{ex.Message}"); } } ///// <summary> ///// ä»»å¡å®ææ¥å£ ///// </summary> ///// <param name="wCSTask"></param> ///// <returns></returns> //public async Task<WebResponseContent> TaskCompleted(WCSTaskDTO wCSTask) //{ // WebResponseContent webResponse = new WebResponseContent(); // try // { // Dt_Task task = await BaseDal.QueryFirstAsync(x => x.TaskId == wCSTask.TaskNum && x.PalletCode == wCSTask.PalletCode); // if (task == null) return webResponse.Error("æªæ¾å°ä»»å¡ä¿¡æ¯"); // // åºåºå®æåé¦ // OutTaskCompleteDto outTaskCompleteDto = new OutTaskCompleteDto() // { // TaskId = task.OrderNo, // DevId = task.TargetAddress, // ReqTime = DateTime.Now.ToString() // }; // return await OutTaskComplete(outTaskCompleteDto); // } // catch (Exception ex) // { // return webResponse.Error($"WMSä»»å¡å®ææ¥å£é误ï¼{ex.Message}"); // } //} /// <summary> /// è¾é线ç³è¯·è¿å ¥ /// </summary> /// <param name="applyEnterDto">请æ±åæ°</param> /// <returns></returns> public async Task<AGVResponse> ApplyEnterAsync(ApplyEnterDto applyEnterDto) { AGVResponse aGVResponse = new AGVResponse(); try { // åæ°éªè¯ if (applyEnterDto == null) return aGVResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyEnterDto.DevId)) return aGVResponse.Error("设å¤ç¼å·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(applyEnterDto.TaskId)) return aGVResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); if (applyEnterDto.InOut != 1 && applyEnterDto.InOut != 2) return aGVResponse.Error($"åºå ¥åºç±»åé误ï¼å¿ 须为1(å ¥åº)æ2(åºåº)ï¼å½åå¼ï¼{applyEnterDto.InOut}"); // æ¥è¯¢ä»»å¡æ¯å¦åå¨ var task = await BaseDal.QueryFirstAsync(x => x.OrderNo == applyEnterDto.TaskId); if (task == null) return aGVResponse.Error($"æªæ¾å°ä»»å¡ä¿¡æ¯ï¼ä»»å¡å·ï¼{applyEnterDto.TaskId}"); if (applyEnterDto.InOut == 1 && task.TaskType == (int)TaskInboundTypeEnum.Inbound && task.TaskStatus == (int)TaskInStatusEnum.InNew) { aGVResponse.OK(); } else if (applyEnterDto.InOut == 2 && task.TaskType == (int)TaskOutboundTypeEnum.Outbound && task.TaskStatus == (int)TaskStatusEnum.Line_Finish) { aGVResponse.OK(); } return aGVResponse.Error($"è¾é线{applyEnterDto.DevId}å½åç¹å¿ï¼è¯·ç¨åéè¯"); // Dt_Task.SourceAddress询é®wcsç«å°1-é´æå ¥å£å«D10010åD10020ï¼2-鳿D10090åD10100æ¯å¦æè´§ç© //var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://127.0.0.1:9999/api/Task/ApplyInOut", JsonSerializer.Serialize(task)).Data; //if (httpResponse != null && httpResponse.Status == true) //{ // _unitOfWorkManage.BeginTran(); // task.TaskStatus = (int)TaskStatusEnum.AGV_Executing; // await BaseDal.UpdateDataAsync(task); // _unitOfWorkManage.CommitTran(); // return aGVResponse.OK(); //} //else //{ // return aGVResponse.Error($"ç«å°{task.SourceAddress}å·²ç»è½½è´§"); //} } catch (Exception ex) { //_unitOfWorkManage.RollbackTran(); return aGVResponse.Error($"WMSè¾é线ç³è¯·æ¥å£é误ï¼{ex.Message}"); } } /// <summary> /// åæ¾è´§å®æ /// </summary> /// <param name="taskCompleteDto">请æ±åæ°</param> /// <returns></returns> public async Task<AGVResponse> TaskCompleteAsync(TaskCompleteDto taskCompleteDto) { AGVResponse aGVResponse = new AGVResponse(); try { if (taskCompleteDto == null) return aGVResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(taskCompleteDto.TaskId)) return aGVResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(taskCompleteDto.DevId)) return aGVResponse.Error("设å¤ç¼å·ä¸è½ä¸ºç©º"); if (taskCompleteDto.InOut != 1 && taskCompleteDto.InOut != 2) return aGVResponse.Error($"åºå ¥åºç±»åé误ï¼å¿ 须为1(å ¥åº)æ2(åºåº)ï¼å½åå¼ï¼{taskCompleteDto.InOut}"); var task = await BaseDal.QueryFirstAsync(x => x.OrderNo == taskCompleteDto.TaskId); if (task == null) return aGVResponse.Error($"æªæ¾å°ä»»å¡ä¿¡æ¯ï¼ä»»å¡å·ï¼{taskCompleteDto.TaskId}"); if (taskCompleteDto.InOut == 2) { var stockInfo = await _stockInfoService.GetStockInfoAsync(task.PalletCode); if (stockInfo == null) return aGVResponse.Error($"æªæ¾å°æç{task.PalletCode}çåºåä¿¡æ¯"); var locationInfo = await _locationInfoService.GetLocationInfoAsync(stockInfo.LocationCode); if (locationInfo == null) return aGVResponse.Error($"æªæ¾å°æç{stockInfo.LocationCode}çè´§ä½ä¿¡æ¯"); if (stockInfo.StockStatus != (int)StockStatusEmun.åºåºéå® || locationInfo.LocationStatus != (int)LocationStatusEnum.InStockLock) { return aGVResponse.Error($"å½ååºå{stockInfo.StockStatus}æè è´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); } locationInfo.LocationStatus = (int)LocationStatusEnum.Free; task.TaskStatus = (int)TaskOutStatusEnum.OutFinish; _unitOfWorkManage.BeginTran(); _stockInfoService.DeleteData(stockInfo); await _locationInfoService.UpdateLocationInfoAsync(locationInfo); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); _unitOfWorkManage.CommitTran(); } else { //æ¥æ¾å¯ç¨è´§ä½ var availableLocation = await _locationInfoService.GetLocationInfo(task.Roadway); if (availableLocation == null) return aGVResponse.Error("æ å¯ç¨çå ¥åºè´§ä½"); task.TargetAddress = availableLocation.LocationCode; // éç¥WCSå ¥åº var wcsTaskDto = _mapper.Map<WCSTaskDTO>(task); var httpResponse = _httpClientHelper.Post<WebResponseContent>(WCS_ReceiveTask, JsonSerializer.Serialize(wcsTaskDto)); if (httpResponse == null) return aGVResponse.Error("ä¸åWCS失败"); task.TaskStatus = (int)TaskStatusEnum.Line_Executing; task.Dispatchertime = DateTime.Now; var locationInfo = await _locationInfoService.GetLocationInfoAsync(task.TargetAddress); if (locationInfo == null) return aGVResponse.Error($"æªæ¾å°æç{task.TargetAddress}çè´§ä½ä¿¡æ¯"); if (locationInfo.LocationStatus != (int)LocationStatusEnum.InStock) { return aGVResponse.Error($"å½åè´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); } Dt_StockInfo dt_Stock = new Dt_StockInfo() { PalletCode = task.PalletCode, StockStatus = (int)StockStatusEmun.å ¥åºç¡®è®¤, LocationCode = locationInfo.LocationCode, WarehouseId = task.WarehouseId, Creater = "AGV", CreateDate = DateTime.Now }; locationInfo.LocationStatus = (int)LocationStatusEnum.FreeLock; _unitOfWorkManage.BeginTran(); BaseDal.UpdateData(task); _locationInfoService.UpdateData(locationInfo); _stockInfoService.AddData(dt_Stock); _unitOfWorkManage.CommitTran(); } return aGVResponse.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return aGVResponse.Error($"WMSåæ¾è´§å®ææ¥å£é误ï¼{ex.Message}"); } } /// <summary> /// ä»»å¡åæ¶ /// </summary> /// <param name="taskCancelDto">请æ±åæ°</param> /// <returns></returns> public async Task<AGVResponse> TaskCancelAsync(TaskCancelDto taskCancelDto) { AGVResponse aGVResponse = new AGVResponse(); try { if (taskCancelDto == null) return aGVResponse.Error("请æ±åæ°ä¸è½ä¸ºç©º"); if (string.IsNullOrWhiteSpace(taskCancelDto.TaskId)) return aGVResponse.Error("ä»»å¡å·ä¸è½ä¸ºç©º"); var task = await BaseDal.QueryFirstAsync(x => x.OrderNo == taskCancelDto.TaskId); // 没æä»»å¡å¼ºå¶åæ¶ if (task == null) return aGVResponse.OK(); if (task.TaskStatus == (int)TaskInStatusEnum.InNew) { task.TaskStatus = (int)TaskInStatusEnum.InCancel; // å ¥åºä»»å¡ç´æ¥å é¤ _unitOfWorkManage.BeginTran(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); _unitOfWorkManage.CommitTran(); return aGVResponse.OK(); } else if (task.TaskStatus == (int)TaskOutStatusEnum.OutNew) { // åºåºä»»å¡æ¢å¤åºå var stockInfo = await _stockInfoService.GetStockInfoAsync(task.PalletCode); if (stockInfo == null) return aGVResponse.Error($"æªæ¾å°æç{task.PalletCode}çåºåä¿¡æ¯"); var locationInfo = await _locationInfoService.GetLocationInfoAsync(stockInfo.LocationCode); if (locationInfo == null) return aGVResponse.Error($"æªæ¾å°æç{stockInfo.LocationCode}çè´§ä½ä¿¡æ¯"); if (stockInfo.StockStatus != (int)StockStatusEmun.åºåºéå® || locationInfo.LocationStatus != (int)LocationStatusEnum.InStockLock) { return aGVResponse.Error($"å½ååºå{stockInfo.StockStatus}æè è´§ä½{locationInfo.LocationStatus}ç¶æä¿¡æ¯é误"); } stockInfo.StockStatus = (int)StockStatusEmun.å ¥åºå®æ; locationInfo.LocationStatus = (int)LocationStatusEnum.InStock; task.TaskStatus = (int)TaskOutStatusEnum.OutCancel; _unitOfWorkManage.BeginTran(); _locationInfoService.UpdateData(locationInfo); _stockInfoService.UpdateData(stockInfo); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.èªå¨å®æ : OperateTypeEnum.äººå·¥å®æ); _unitOfWorkManage.CommitTran(); return aGVResponse.OK(); } return aGVResponse.Error("ä»»å¡å·²ç»å¨æ§è¡ä¸ï¼ä¸å¯åæ¶"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return aGVResponse.Error($"WMSä»»å¡åæ¶æ¥å£é误ï¼{ex.Message}"); } } #endregion æå·åºä»»å¡æ¨¡å } } Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,209 @@ using Mapster; using MapsterMapper; using Microsoft.Extensions.Configuration; using SqlSugar; using System.DirectoryServices.Protocols; using System.Text.Json; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Core; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.GradingMachine; using WIDESEA_DTO.MES; using WIDESEA_DTO.Stock; using WIDESEA_DTO.Task; using WIDESEA_IBasicService; using WIDESEA_IStockService; using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; namespace WIDESEA_TaskInfoService { public partial class TaskService { #region åå®¹ææ¥å£ /// <summary> /// å åæºåæ¾è´§å®æåç©æµéç¥åæå容æå®æä¿¡å· /// </summary> public async Task<WebResponseContent> InOrOutCompletedAsync(GradingMachineInputDto input) { WebResponseContent content = new WebResponseContent(); if (string.IsNullOrWhiteSpace(input.PalletCode) || string.IsNullOrWhiteSpace(input.LocationCode)) { return content.Error($"æçå·æè è´§ä½ç¼å·ä¸è½ä¸ºç©º"); } try { var stockInfo = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode); int locationStatus; if (stockInfo == null) { var location = await _locationInfoService.GetLocationInfoAsync(input.LocationCode); locationStatus = location?.LocationStatus ?? 0; } else { locationStatus = stockInfo.LocationDetails?.LocationStatus ?? 0; } OutputDto outPutDto = new OutputDto() { LocationCode = input.LocationCode, PalletCode = input.PalletCode, IsNormalProcedure = 1, LocationStatus = locationStatus }; return content.OK(data: outPutDto); } catch (Exception ex) { content.Error(ex.Message); } return content; } /// <summary> /// åæå容æå®æ¶åç©æµæ´æ°å容æç¶æä¿¡æ¯ /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<WebResponseContent> SendLocationStatusAsync(GradingMachineInputDto input) { WebResponseContent content = new WebResponseContent(); if (string.IsNullOrWhiteSpace(input.LocationCode)) { return content.Error($"è´§ä½ç¼å·ä¸è½ä¸ºç©º"); } try { var result = await _locationInfoService.Db.Updateable<Dt_LocationInfo>() .SetColumns(s => new Dt_LocationInfo { LocationStatus = input.LocationStatus }).Where(s => s.LocationCode == input.LocationCode).ExecuteCommandAsync() > 0; if (result) { content.OK("æ´æ°æå"); } else { content.Error("æ´æ°å¤±è´¥"); } } catch (Exception ex) { content.Error(ex.Message); } return content; } /// <summary> /// å容æå·¥ä½å®æåè°ç¨æ¤æ¥å£éç¥ç©æµåºåº /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<WebResponseContent> RequestOutboundAsync(GradingMachineInputDto input) { WebResponseContent content = new WebResponseContent(); if (string.IsNullOrWhiteSpace(input.LocationCode) || string.IsNullOrWhiteSpace(input.PalletCode)) { return content.Error($"æçå·æè è´§ä½ç¼å·ä¸è½ä¸ºç©º"); } try { var stock = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode); if (stock == null) { content.Error("æªæ¾å°å¯¹åºçæç"); } else { var taskList = new Dt_Task { WarehouseId = stock.WarehouseId, PalletCode = stock.PalletCode, PalletType = stock.PalletType, SourceAddress = stock.LocationCode, CurrentAddress = stock.LocationCode, NextAddress = "10080", TargetAddress = "10081", Roadway = stock.LocationDetails.RoadwayNo, TaskType = TaskTypeEnum.Outbound.GetHashCode(), TaskStatus = TaskStatusEnum.New.GetHashCode(), Grade = 1, TaskNum = await BaseDal.GetTaskNo(), Creater = "system", }; var result = await BaseDal.AddDataAsync(taskList) > 0; var wmstaskDto = result ? _mapper.Map<WMSTaskDTO>(taskList) : null; var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://logistics-service/api/logistics/notifyoutbound", JsonSerializer.Serialize(wmstaskDto)).Data; if (result && httpResponse != null) { content.OK("åºåºè¯·æ±æå"); } else { content.Error("åºåºè¯·æ±å¤±è´¥"); } } } catch (Exception ex) { content.Error(ex.Message); } return content; } /// <summary> /// å ¥åºå®æå容è°ç¨è·åæç䏿¯ä¸ªééçµè¯ /// </summary> /// <param name="input"></param> /// <returns></returns> public async Task<WebResponseContent> GetPalletCodeCellAsync(GradingMachineInputDto input) { WebResponseContent content = new WebResponseContent(); if (string.IsNullOrWhiteSpace(input.PalletCode) || string.IsNullOrWhiteSpace(input.LocationCode)) { return content.Error($"æçå·æè è´§ä½ç¼å·ä¸è½ä¸ºç©º"); } try { var stockInfo = await _stockInfoService.GetStockInfoAsync(input.PalletCode, input.LocationCode); if (stockInfo == null) { return content.Error("æªæ¾å°å¯¹åºçæç"); } var outPutDtos = stockInfo.Details.Select(x => new OutputDto() { LocationCode = input.LocationCode, PalletCode = input.PalletCode, IsNormalProcedure = 1, LocationStatus = stockInfo.LocationDetails.LocationStatus, CellCode = x.SerialNumber, Channel = x.InboundOrderRowNo.ToString() }).ToList(); return content.OK(data: outPutDtos); } catch (Exception ex) { return content.Error(ex.Message); } } #endregion åå®¹ææ¥å£ } } Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_WCS.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,896 @@ using Mapster; using MapsterMapper; using Microsoft.Extensions.Configuration; using SqlSugar; using System.DirectoryServices.Protocols; using System.Text.Json; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Core; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.GradingMachine; using WIDESEA_DTO.MES; using WIDESEA_DTO.Stock; using WIDESEA_DTO.Task; using WIDESEA_IBasicService; using WIDESEA_IStockService; using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; namespace WIDESEA_TaskInfoService { public partial class TaskService { #region WCSé»è¾å¤ç /// <summary> /// å建任å¡ï¼ç»çå ¥åºä»»å¡ã空æçååºä»»å¡ï¼ /// </summary> public async Task<WebResponseContent> CreateTaskInboundAsync(CreateTaskDto taskDto) { try { WebResponseContent content = await GetTaskByPalletCodeAsync(taskDto.PalletCode); if (content.Status) { return content; } if (string.IsNullOrWhiteSpace(taskDto.PalletCode) || string.IsNullOrWhiteSpace(taskDto.Roadway)) { return WebResponseContent.Instance.Error("æ æçä»»å¡è¯¦æ "); } if (taskDto.TaskType != TaskTypeEnum.Inbound && taskDto.TaskType != TaskTypeEnum.InEmpty) { return WebResponseContent.Instance.Error("æ æçä»»å¡è¯¦æ "); } // ä½¿ç¨ switch è¡¨è¾¾å¼æ å°ä»»å¡ç±»å int taskInboundType = taskDto.TaskType switch { TaskTypeEnum.Inbound => TaskInboundTypeEnum.Inbound.GetHashCode(), TaskTypeEnum.InEmpty => TaskInboundTypeEnum.InEmpty.GetHashCode(), _ => 0 // ç论ä¸ä¸ä¼èµ°å°è¿éï¼å 为已ç»éªè¯è¿äº }; var task = new Dt_Task { TaskNum = await BaseDal.GetTaskNo(), PalletCode = taskDto.PalletCode, PalletType = taskDto.PalletType, Roadway = taskDto.Roadway, TaskType = taskInboundType, TaskStatus = TaskInStatusEnum.InNew.GetHashCode(), SourceAddress = taskDto.SourceAddress, TargetAddress = taskDto.TargetAddress, CurrentAddress = taskDto.SourceAddress, NextAddress = taskDto.TargetAddress, WarehouseId = taskDto.WarehouseId, Grade = 1, Creater = "system" }; var result = await Repository.AddDataAsync(task) > 0; if (!result) return WebResponseContent.Instance.Error("ä»»å¡å建失败"); var wmstaskDto = _mapper.Map<WMSTaskDTO>(task); return WebResponseContent.Instance.OK("ä»»å¡å建æå", wmstaskDto); } catch (Exception ex) { return WebResponseContent.Instance.Error($"ä»»å¡å建失败: {ex.Message}"); } } /// <summary> /// æ ¹æ®æå®çä»»å¡è¯¦æ 弿¥å建æ°çåºåºä»»å¡ /// </summary> public async Task<WebResponseContent> CreateTaskOutboundAsync(CreateTaskDto taskDto) { try { var stockResult = await _stockInfoService.GetStockInfoAsync(taskDto.WarehouseId); if (stockResult == null || !stockResult.Any()) return WebResponseContent.Instance.Error("æªæ¾å°åºåä¿¡æ¯"); var taskList = stockResult.Select(item => new Dt_Task { WarehouseId = item.WarehouseId, PalletCode = item.PalletCode, PalletType = item.PalletType, SourceAddress = item.LocationCode, TargetAddress = taskDto.TargetAddress, Roadway = item.LocationDetails.RoadwayNo, TaskType = TaskTypeEnum.Outbound.GetHashCode(), TaskStatus = TaskStatusEnum.New.GetHashCode(), Grade = 1, TaskNum = 0, CurrentAddress = item.LocationCode, NextAddress = taskDto.TargetAddress, Creater = "system", }).ToList(); var result = await BaseDal.AddDataAsync(taskList) > 0; var wmstaskDto = result ? _mapper.Map<WMSTaskDTO>(taskList) : null; return WebResponseContent.Instance.OK(result ? "ä»»å¡å建æå" : "ä»»å¡å建失败", wmstaskDto ?? new object()); } catch (Exception ex) { return WebResponseContent.Instance.Error($"ä»»å¡å建失败: {ex.Message}"); } } /// <summary> /// è·åå¯å ¥åºè´§ä½ /// </summary> public async Task<WebResponseContent> GetTasksLocationAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var locationInfo = await _locationInfoService.GetLocationInfo(task.Roadway); if (locationInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); return await ExecuteWithinTransactionAsync(async () => { locationInfo.LocationStatus = LocationStatusEnum.FreeLock.GetHashCode(); task.CurrentAddress = task.SourceAddress; task.NextAddress = locationInfo.LocationCode; task.TargetAddress = locationInfo.LocationCode; task.TaskStatus = TaskInStatusEnum.Line_InFinish.GetHashCode(); var updateTaskResult = await BaseDal.UpdateDataAsync(task); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(locationInfo); if (!updateTaskResult || !updateLocationResult) { return WebResponseContent.Instance.Error("任塿´æ°å¤±è´¥"); } return WebResponseContent.Instance.OK("任塿´æ°æå", locationInfo.LocationCode); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"è·åä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// å ¥åºä»»å¡å®æï¼æ·»å åºåï¼ä¿®æ¹è´§ä½ç¶æï¼å é¤ä»»å¡æ°æ®ï¼æ·»å åå²ä»»å¡æ°æ® /// </summary> public async Task<WebResponseContent> InboundFinishTaskAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.TargetAddress); if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); // 夿æ¯ä¸æ¯æå·åºä»»å¡ //if (taskDto.WarehouseId == (int)WarehouseEnum.FJ1 || taskDto.WarehouseId == (int)WarehouseEnum.ZJ1) //{ // return WebResponseContent.Instance.OK(); //} return await ExecuteWithinTransactionAsync(async () => { WebResponseContent content = new WebResponseContent(); stockInfo.LocationCode = location.LocationCode; stockInfo.LocationId = location.Id; stockInfo.OutboundDate = task.Roadway switch { var r when r.Contains("GW") => DateTime.Now.AddHours(2), var r when r.Contains("CW") => DateTime.Now.AddHours(1), _ => DateTime.Now }; stockInfo.StockStatus = StockStatusEmun.å ¥åºå®æ.GetHashCode(); location.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateLocationResult || !updateStockResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); // è°ç¨MESæçè¿ç« var inboundRequest = new InboundInContainerRequest { EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainerCode = taskDto.PalletCode }; var inboundResult = _mesService.InboundInContainer(inboundRequest); if (inboundResult == null || inboundResult.Data == null || !inboundResult.Data.IsSuccess) { return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESè¿ç«å¤±è´¥: {inboundResult?.Data?.Msg ?? inboundResult?.ErrorMessage ?? "æªç¥é误"}"); } return await CompleteTaskAsync(task, "å ¥åºå®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// åºåºä»»å¡å®æ ï¼ä¿®æ¹åºåï¼ä¿®æ¹è´§ä½ç¶æï¼å é¤ä»»å¡æ°æ®ï¼æ·»å åå²ä»»å¡æ°æ® /// </summary> public async Task<WebResponseContent> OutboundFinishTaskAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress); if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); // 夿æ¯ä¸æ¯æå·åºä»»å¡ if (taskDto.WarehouseId == (int)WarehouseEnum.FJ1 || taskDto.WarehouseId == (int)WarehouseEnum.ZJ1) { OutTaskCompleteDto outTaskCompleteDto = new OutTaskCompleteDto() { TaskId = task.OrderNo, DevId = task.TargetAddress, ReqTime = DateTime.Now.ToString() }; return await OutTaskComplete(outTaskCompleteDto); } WebResponseContent content = new WebResponseContent(); return await ExecuteWithinTransactionAsync(async () => { stockInfo.LocationId = 0; stockInfo.LocationCode = null; stockInfo.OutboundDate = DateTime.Now; location.LocationStatus = LocationStatusEnum.Free.GetHashCode(); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateLocationResult || !updateStockResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); // è°ç¨MESæçåºç« var outboundRequest = new OutboundInContainerRequest { EquipmentCode = "STK-GROUP-001", ResourceCode = "STK-GROUP-001", LocalTime = DateTime.Now, ContainerCode = taskDto.PalletCode, ParamList = new List<ParamItem>() }; var outboundResult = _mesService.OutboundInContainer(outboundRequest); if (outboundResult == null || outboundResult.Data == null || !outboundResult.Data.IsSuccess) { return content.Error($"ä»»å¡å®æå¤±è´¥ï¼MESåºç«å¤±è´¥: {outboundResult?.Data?.Msg ?? outboundResult?.ErrorMessage ?? "æªç¥é误"}"); } return await CompleteTaskAsync(task, "åºåºå®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// ç§»åºä»»å¡å®æï¼ä¿®æ¹åºåä½ç½®ä¸ç¶æï¼ä¿®æ¹æº/ç®æ è´§ä½ç¶æï¼å é¤ä»»å¡æ°æ® /// </summary> public async Task<WebResponseContent> RelocationFinishTaskAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode && s.TaskType == TaskRelocationTypeEnum.Relocation.GetHashCode()); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçç§»åºä»»å¡"); var sourceLocation = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress); if (sourceLocation == null) return WebResponseContent.Instance.Error("æªæ¾å°ç§»åºæºè´§ä½"); var targetLocation = await _locationInfoService.GetLocationInfo(task.Roadway, task.TargetAddress); if (targetLocation == null) return WebResponseContent.Instance.Error("æªæ¾å°ç§»åºç®æ è´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); return await ExecuteWithinTransactionAsync(async () => { stockInfo.LocationCode = targetLocation.LocationCode; stockInfo.LocationId = targetLocation.Id; stockInfo.StockStatus = StockStatusEmun.å ¥åºå®æ.GetHashCode(); sourceLocation.LocationStatus = LocationStatusEnum.Free.GetHashCode(); targetLocation.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); var updateSourceResult = await _locationInfoService.UpdateLocationInfoAsync(sourceLocation); var updateTargetResult = await _locationInfoService.UpdateLocationInfoAsync(targetLocation); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateSourceResult || !updateTargetResult || !updateStockResult) return WebResponseContent.Instance.Error("ç§»åºä»»å¡å®æå¤±è´¥"); return await CompleteTaskAsync(task, "ç§»åºå®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// å建空æçå ¥åºä»»å¡ /// </summary> /// <param name="taskDto"></param> /// <returns></returns> public async Task<WebResponseContent> CreateTaskInboundTrayAsync(CreateTaskDto taskDto) { try { WebResponseContent content = await GetTaskByPalletCodeAsync(taskDto.PalletCode); if (content.Status) { return content; } //var tasks = await BaseDal.QueryAsync(s => s.PalletCode == palletCode); //if (tasks == null || !tasks.Any()) // return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); //var taskDtos = _mapper.Map<List<WMSTaskDTO>>(tasks); return WebResponseContent.Instance.OK("æ¥è¯¢æå"/*, taskDtos*/); } catch (Exception ex) { return WebResponseContent.Instance.Error($"æ¥è¯¢ä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// 空æçå ¥åºå®æ /// </summary> public async Task<WebResponseContent> InboundFinishTaskTrayAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.TargetAddress); if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); return await ExecuteWithinTransactionAsync(async () => { stockInfo.LocationCode = location.LocationCode; stockInfo.LocationId = location.Id; stockInfo.StockStatus = StockStatusEmun.空æçåºå.GetHashCode(); location.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateLocationResult || !updateStockResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); // ä¿åä»»å¡åå² var historyTask = _mapper.Map<Dt_Task_Hty>(task); historyTask.InsertTime = DateTime.Now; historyTask.OperateType = "空æçå ¥åºå®æ"; if (await _task_HtyService.Repository.AddDataAsync(historyTask) <= 0) return WebResponseContent.Instance.Error("ä»»å¡åå²ä¿å失败"); // ä¿ååºååå² var historyStock = _mapper.Map<Dt_StockInfo_Hty>(stockInfo); historyStock.InsertTime = DateTime.Now; historyStock.OperateType = "空æçå ¥åºå®æ"; if (await _stockInfo_HtyService.Repository.AddDataAsync(historyStock) <= 0) return WebResponseContent.Instance.Error("åºååå²ä¿å失败"); var deleteResult = await BaseDal.DeleteDataAsync(task); if (!deleteResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); return WebResponseContent.Instance.OK("ä»»å¡å®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// å建空æçåºåºä»»å¡ /// </summary> /// <param name="taskDto"></param> /// <returns></returns> public async Task<WebResponseContent> GetOutBoundTrayTaskAsync(CreateTaskDto taskDto) { try { var stockInfo = await _stockInfoService.Repository.QueryDataNavFirstAsync(x => x.LocationDetails.WarehouseId == taskDto.WarehouseId && x.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode() && x.StockStatus == StockStatusEmun.空æçåºå.GetHashCode()); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçåºåä¿¡æ¯"); var task = new Dt_Task() { WarehouseId = stockInfo.LocationDetails.WarehouseId, PalletCode = stockInfo.PalletCode, PalletType = stockInfo.PalletType, SourceAddress = stockInfo.LocationCode, CurrentAddress = stockInfo.LocationCode, NextAddress = taskDto.TargetAddress, TargetAddress = taskDto.TargetAddress, Roadway = stockInfo.LocationDetails.RoadwayNo, TaskType = TaskOutboundTypeEnum.OutEmpty.GetHashCode(), TaskStatus = TaskStatusEnum.New.GetHashCode(), Grade = 1, TaskNum = await BaseDal.GetTaskNo(), Creater = "system", }; var taskDtos = task.Adapt<WMSTaskDTO>(); var addResult = await BaseDal.AddDataAsync(task) > 0; if (!addResult) return WebResponseContent.Instance.Error("ä»»å¡å建失败"); return WebResponseContent.Instance.OK("ä»»å¡å建æå", taskDtos); } catch (Exception ex) { return WebResponseContent.Instance.Error($"æ¥è¯¢ä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// 空æçåºåºå®æ /// </summary> public async Task<WebResponseContent> OutboundFinishTaskTrayAsync(CreateTaskDto taskDto) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == taskDto.PalletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var location = await _locationInfoService.GetLocationInfo(task.Roadway, task.SourceAddress); if (location == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçè´§ä½"); var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); return await ExecuteWithinTransactionAsync(async () => { stockInfo.LocationId = 0; stockInfo.LocationCode = null; stockInfo.StockStatus = StockStatusEmun.åºåºå®æ.GetHashCode(); location.LocationStatus = LocationStatusEnum.Free.GetHashCode(); var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); if (!updateLocationResult || !updateStockResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); // ä¿åä»»å¡åå² var historyTask = _mapper.Map<Dt_Task_Hty>(task); historyTask.InsertTime = DateTime.Now; historyTask.OperateType = "空æçåºåºå®æ"; if (await _task_HtyService.Repository.AddDataAsync(historyTask) <= 0) return WebResponseContent.Instance.Error("ä»»å¡åå²ä¿å失败"); // ä¿ååºååå² var historyStock = _mapper.Map<Dt_StockInfo_Hty>(stockInfo); historyStock.InsertTime = DateTime.Now; historyStock.OperateType = "空æçåºåºå®æ"; if (await _stockInfo_HtyService.Repository.AddDataAsync(historyStock) <= 0) return WebResponseContent.Instance.Error("åºååå²ä¿å失败"); var deleteResult = await BaseDal.DeleteDataAsync(task); if (!deleteResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); return WebResponseContent.Instance.OK("ä»»å¡å®æ"); }); } catch (Exception ex) { return WebResponseContent.Instance.Error($"宿任å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// ä¿®æ¹ä»»å¡ç¶æï¼æ ¹æ®ä»»å¡IDä¿®æ¹ä¸ºæå®ç¶æï¼ /// </summary> /// <param name="taskId"></param> /// <param name="newStatus"></param> /// <returns></returns> public async Task<WebResponseContent> UpdateTaskByStatusAsync(int taskId, int newStatus) { try { var tasks = await BaseDal.QueryFirstAsync(s => s.TaskNum == taskId); if (tasks == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); tasks.TaskStatus = newStatus; await BaseDal.UpdateDataAsync(tasks); return WebResponseContent.Instance.OK("ä¿®æ¹æå", tasks); } catch (Exception ex) { return WebResponseContent.Instance.Error($"ä¿®æ¹å¤±è´¥: {ex.Message}"); } } /// <summary> /// æ¥æ¾æçæ¯å¦æä»»å¡ /// </summary> /// <param name="palletCode"></param> /// <returns></returns> private async Task<WebResponseContent> GetTaskByPalletCodeAsync(string palletCode) { try { var task = await BaseDal.QueryFirstAsync(s => s.PalletCode == palletCode); if (task == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡"); var taskDto = _mapper.Map<WMSTaskDTO>(task); return WebResponseContent.Instance.OK("æ¥è¯¢æå", taskDto); } catch (Exception ex) { return WebResponseContent.Instance.Error($"æ¥è¯¢ä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// 宿任å¡åç»ä¸å¤çï¼å é¤ä»»å¡æ°æ®ï¼ /// </summary> private async Task<WebResponseContent> CompleteTaskAsync(Dt_Task task, string operateType = "") { var deleteTaskResult = await BaseDal.DeleteDataAsync(task); if (!deleteTaskResult) return WebResponseContent.Instance.Error("ä»»å¡å®æå¤±è´¥"); var historyTask = _mapper.Map<Dt_Task_Hty>(task); historyTask.InsertTime = DateTime.Now; historyTask.OperateType = operateType; var saveResult = await _task_HtyService.Repository.AddDataAsync(historyTask) > 0; if (!saveResult) return WebResponseContent.Instance.Error("ä»»å¡åå²ä¿å失败"); return WebResponseContent.Instance.OK("ä»»å¡å®æ"); } /// <summary> /// æ ¹æ®å··éç¡®å®ç®æ å°åï¼æ¯æå¤åºåºå£è½®è¯¢ï¼ /// </summary> private string DetermineTargetAddress(string roadway, Dictionary<string, List<string>> addressMap) { if (string.IsNullOrWhiteSpace(roadway)) return "10080"; // æ¥æ¾å¹é çå··éåç¼ string matchedPrefix = null; foreach (var kvp in addressMap) { if (roadway.Contains(kvp.Key)) { matchedPrefix = kvp.Key; break; } } if (matchedPrefix == null) return "10080"; var addresses = addressMap[matchedPrefix]; if (addresses == null || addresses.Count == 0) return "10080"; // å个å°åï¼ç´æ¥è¿å if (addresses.Count == 1) return addresses[0]; // å¤ä¸ªå°åï¼ä½¿ç¨è½®è¯¢æå¡ return _roundRobinService.GetNextAddress(matchedPrefix, addresses); } /// <summary> /// èªå¨å建åºåºä»»å¡ - æ¥è¯¢å°æåºåå¹¶åå»ºä»»å¡ /// </summary> public async Task<WebResponseContent> CreateAutoOutboundTasksAsync() { try { // 1. æ¥è¯¢å°æåºå var expiredStocks = await _stockInfoService.Repository .QueryDataNavAsync(s => s.OutboundDate <= DateTime.Now && s.StockStatus == StockStatusEmun.å ¥åºå®æ.GetHashCode()); if (expiredStocks == null || !expiredStocks.Any()) { return WebResponseContent.Instance.OK("æ å°æåºåéè¦å¤ç"); } // è¿æ»¤æä½ç½®ä¸ä½ç½®æåºåçè®°å½ expiredStocks = expiredStocks .Where(s => s.LocationDetails != null && s.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode()) .ToList(); if (!expiredStocks.Any()) { return WebResponseContent.Instance.OK("æ ç¬¦åæ¡ä»¶çå°æåºå"); } // 2. æ£æ¥å·²åå¨çä»»å¡ var palletCodes = expiredStocks.Select(s => s.PalletCode).ToList(); var existingTasks = await Repository.QueryDataAsync(t => palletCodes.Contains(t.PalletCode) && (t.TaskStatus == TaskStatusEnum.New.GetHashCode() || t.TaskStatus == TaskStatusEnum.SC_Executing.GetHashCode() || t.TaskStatus == TaskInStatusEnum.InNew.GetHashCode())); var processedPallets = existingTasks.Select(t => t.PalletCode).ToHashSet(); // 3. çééè¦å¤ççåºå var stocksToProcess = expiredStocks .Where(s => !processedPallets.Contains(s.PalletCode)) .ToList(); if (!stocksToProcess.Any()) { return WebResponseContent.Instance.OK("ææå°æåºåå·²åå¨ä»»å¡"); } // 4. è·åé ç½®çç®æ å°åæ å° var targetAddressMap = _configuration.GetSection("AutoOutboundTask:TargetAddresses") .Get<Dictionary<string, List<string>>>() ?? new Dictionary<string, List<string>>(); // 5. æ¹éåå»ºä»»å¡ var taskList = new List<Dt_Task>(); foreach (var stock in stocksToProcess) { // æ ¹æ®å··éç¡®å®ç®æ å°å var targetAddress = DetermineTargetAddress( stock.LocationDetails?.RoadwayNo ?? "", targetAddressMap); var task = new Dt_Task { WarehouseId = stock.WarehouseId, PalletCode = stock.PalletCode, PalletType = stock.PalletType, SourceAddress = stock.LocationCode, CurrentAddress = stock.LocationCode, NextAddress = targetAddress, TargetAddress = targetAddress, Roadway = stock.LocationDetails?.RoadwayNo ?? "", TaskType = TaskTypeEnum.Outbound.GetHashCode(), TaskStatus = TaskStatusEnum.New.GetHashCode(), Grade = 1, TaskNum = await BaseDal.GetTaskNo(), Creater = "system_auto" }; taskList.Add(task); } var transactionResult = await ExecuteWithinTransactionAsync(async () => { var addResult = await BaseDal.AddDataAsync(taskList) > 0; if (!addResult) { return WebResponseContent.Instance.Error($"æ¹éå建任å¡å¤±è´¥ï¼å ± {taskList.Count} 个任å¡"); } // ä»»å¡å建æååï¼åæ¥éå®åºååè´§ä½ç¶æï¼é¿å éå¤åé var stocksToUpdate = stocksToProcess .Select(s => { s.StockStatus = StockStatusEmun.åºåºéå®.GetHashCode(); return s; }) .ToList(); var updateStockResult = await _stockInfoService.Repository.UpdateDataAsync(stocksToUpdate); if (!updateStockResult) { return WebResponseContent.Instance.Error($"ä»»å¡å建æåï¼ä½åºåç¶ææ´æ°å¤±è´¥ï¼å ± {stocksToUpdate.Count} æ¡"); } var locationsToUpdate = stocksToProcess .Where(s => s.LocationDetails != null) .GroupBy(s => s.LocationDetails.Id) .Select(g => { var location = g.First().LocationDetails; location.LocationStatus = LocationStatusEnum.InStockLock.GetHashCode(); return location; }) .ToList(); if (locationsToUpdate.Any()) { var updateLocationResult = await _locationInfoService.Repository.UpdateDataAsync(locationsToUpdate); if (!updateLocationResult) { return WebResponseContent.Instance.Error($"ä»»å¡å建æåï¼ä½è´§ä½ç¶ææ´æ°å¤±è´¥ï¼å ± {locationsToUpdate.Count} æ¡"); } } return WebResponseContent.Instance.OK(); }); if (!transactionResult.Status) { return transactionResult; } // 6. éç¥ WCSï¼å¼æ¥ï¼ä¸å½±å主æµç¨ï¼ _ = Task.Run(() => { try { var wmstaskDtos = _mapper.Map<List<WMSTaskDTO>>(taskList); _httpClientHelper.Post<WebResponseContent>( "http://localhost:9292/api/Task/ReceiveTask", wmstaskDtos.ToJson()); } catch (Exception ex) { // WCS éç¥å¤±è´¥ä¸å½±åä»»å¡å建ï¼è®°å½æ¥å¿å³å¯ Console.WriteLine($"WCS æ¹ééç¥å¤±è´¥ï¼ä»»å¡æ°é: {taskList.Count}, é误: {ex.Message}"); } }); return WebResponseContent.Instance.OK($"æåå建 {taskList.Count} 个åºåºä»»å¡", taskList.Count); } catch (Exception ex) { return WebResponseContent.Instance.Error($"èªå¨å建åºåºä»»å¡å¤±è´¥: {ex.Message}"); } } /// <summary> /// åå»ºæºæ¢°æç»çä»»å¡ /// </summary> public async Task<WebResponseContent> CreateRobotGroupPalletTaskAsync(StockDTO stock) { return await CreateRobotPalletTaskAsync( stock, "ç»ç", RobotTaskTypeEnum.GroupPallet, s => string.IsNullOrWhiteSpace(s.TargetPalletNo) ? s.SourcePalletNo : s.TargetPalletNo, requireStockWithoutLocation: false); } /// <summary> /// åå»ºæºæ¢°ææ¢çä»»å¡ /// </summary> public async Task<WebResponseContent> CreateRobotChangePalletTaskAsync(StockDTO stock) { return await CreateRobotPalletTaskAsync( stock, "æ¢ç", RobotTaskTypeEnum.ChangePallet, s => s.SourcePalletNo, requireStockWithoutLocation: true, stockPalletCodeSelector: s => s.SourcePalletNo); } /// <summary> /// åå»ºæºæ¢°ææçä»»å¡ /// </summary> public async Task<WebResponseContent> CreateRobotSplitPalletTaskAsync(StockDTO stock) { return await CreateRobotPalletTaskAsync( stock, "æç", RobotTaskTypeEnum.SplitPallet, s => s.SourcePalletNo, requireStockWithoutLocation: true, stockPalletCodeSelector: s => s.SourcePalletNo); } private async Task<WebResponseContent> CreateRobotPalletTaskAsync( StockDTO stock, string taskName, RobotTaskTypeEnum taskType, Func<StockDTO, string?> palletCodeSelector, bool requireStockWithoutLocation, Func<StockDTO, string?>? stockPalletCodeSelector = null) { try { if (stock == null) return WebResponseContent.Instance.Error("ä»»å¡åæ°ä¸è½ä¸ºç©º"); var palletCode = palletCodeSelector(stock)?.Trim(); if (string.IsNullOrWhiteSpace(palletCode)) return WebResponseContent.Instance.Error("æçå·ä¸è½ä¸ºç©º"); var sourceLineNo = stock.SourceLineNo?.Trim(); var targetLineNo = stock.TargetLineNo?.Trim(); if (string.IsNullOrWhiteSpace(sourceLineNo) || string.IsNullOrWhiteSpace(targetLineNo)) return WebResponseContent.Instance.Error("æ¥æºçº¿ä½ç¼å·åç®æ 线ä½ç¼å·ä¸è½ä¸ºç©º"); var existingTask = await BaseDal.QueryFirstAsync(t => t.PalletCode == palletCode && (t.TaskStatus == TaskRobotStatusEnum.RobotNew.GetHashCode() || t.TaskStatus == TaskRobotStatusEnum.RobotExecuting.GetHashCode() || t.TaskStatus == TaskRobotStatusEnum.RobotPickFinish.GetHashCode() || t.TaskStatus == TaskRobotStatusEnum.RobotPutFinish.GetHashCode() || t.TaskStatus == TaskRobotStatusEnum.RobotPending.GetHashCode())); if (existingTask != null) return WebResponseContent.Instance.Error($"æç[{palletCode}]å·²å卿ªå®æä»»å¡"); Dt_StockInfo? stockInfo = null; if (requireStockWithoutLocation) { var stockPalletCode = (stockPalletCodeSelector ?? palletCodeSelector).Invoke(stock)?.Trim(); if (string.IsNullOrWhiteSpace(stockPalletCode)) return WebResponseContent.Instance.Error("æºæçå·ä¸è½ä¸ºç©º"); stockInfo = await _stockInfoService.GetStockInfoAsync(stockPalletCode); if (stockInfo == null) return WebResponseContent.Instance.Error($"æç[{stockPalletCode}]åºåä¸åå¨"); if (stockInfo.LocationId > 0 || !string.IsNullOrWhiteSpace(stockInfo.LocationCode)) return WebResponseContent.Instance.Error($"æç[{stockPalletCode}]åºåå·²ç»å®è´§ä½ï¼ä¸è½åå»ºæºæ¢°æ{taskName}ä»»å¡"); } var task = new Dt_Task { TaskNum = await BaseDal.GetTaskNo(), PalletCode = palletCode, PalletType = stockInfo?.PalletType ?? 0, Roadway = stock.Roadway, TaskType = taskType.GetHashCode(), TaskStatus = TaskRobotStatusEnum.RobotNew.GetHashCode(), SourceAddress = sourceLineNo, TargetAddress = targetLineNo, CurrentAddress = sourceLineNo, NextAddress = targetLineNo, WarehouseId = stockInfo?.WarehouseId ?? 1, Grade = 1, Remark = $"æºæ¢°æ{taskName}", Creater = "system" }; var result = await Repository.AddDataAsync(task) > 0; if (!result) return WebResponseContent.Instance.Error($"æºæ¢°æ{taskName}ä»»å¡å建失败"); var wmstaskDto = _mapper.Map<WMSTaskDTO>(task); return WebResponseContent.Instance.OK($"æºæ¢°æ{taskName}ä»»å¡å建æå", wmstaskDto); } catch (Exception ex) { return WebResponseContent.Instance.Error($"æºæ¢°æ{taskName}ä»»å¡å建失败: {ex.Message}"); } } #endregion WCSé»è¾å¤ç } }