diff --git a/Sln.Wcs.Business/TaskCreateService.cs b/Sln.Wcs.Business/TaskCreateService.cs index 56e4f15..7db7c1a 100644 --- a/Sln.Wcs.Business/TaskCreateService.cs +++ b/Sln.Wcs.Business/TaskCreateService.cs @@ -73,10 +73,17 @@ public class TaskCreateService int startBuilding, int startFloor, string startLocation, int endBuilding, int endFloor, string endLocation, int taskType, int taskCategory, - string palletBarcode, string materialCode) + string palletBarcode, string materialCode, + bool manualPutIn = false, bool manualTakeOut = false) { - var startPoint = PosCode(startBuilding, startFloor, startLocation); - var endPoint = PosCode(endBuilding, endFloor, endLocation); + // 手动放入: 起始位置替换为提升机接驳位 + // 手动取出: 目标位置替换为提升机接驳位 + var startPoint = manualPutIn + ? HoistPoint(startBuilding, startFloor) + : PosCode(startBuilding, startFloor, startLocation); + var endPoint = manualTakeOut + ? HoistPoint(endBuilding, endFloor) + : PosCode(endBuilding, endFloor, endLocation); _logger.Info($"创建任务 - {startPoint} ({startBuilding}#_{startFloor}F) → {endPoint} ({endBuilding}#_{endFloor}F)"); @@ -112,8 +119,12 @@ public class TaskCreateService var hoistEntry = HoistPoint(b1, f1); var hoistExit = HoistPoint(b2, f2); - details.Add(NewDetail(taskCode, palletBarcode, materialCode, - taskType, taskCategory, seq++, currentPos, hoistEntry, deviceType: 1)); + // 手动放入时已在提升机口,无需 AGV 段 + if (currentPos != hoistEntry) + { + details.Add(NewDetail(taskCode, palletBarcode, materialCode, + taskType, taskCategory, seq++, currentPos, hoistEntry, deviceType: 1)); + } details.Add(NewDetail(taskCode, palletBarcode, materialCode, taskType, taskCategory, seq++, hoistEntry, hoistExit, deviceType: 2)); @@ -121,7 +132,7 @@ public class TaskCreateService } } - // Step 3: 最终 AGV 送达终点(同栋同层时直接一条 AGV) + // Step 3: 最终 AGV 送达终点(同栋同层时直接一条 AGV;手动取出时终点=提升机口,已到达则跳过) if (details.Count == 0 || currentPos != endPoint) { details.Add(NewDetail(taskCode, palletBarcode, materialCode, diff --git a/Sln.Wcs.UI/ViewModels/Task/CreateTaskViewModel.cs b/Sln.Wcs.UI/ViewModels/Task/CreateTaskViewModel.cs index 17e1af6..940e91f 100644 --- a/Sln.Wcs.UI/ViewModels/Task/CreateTaskViewModel.cs +++ b/Sln.Wcs.UI/ViewModels/Task/CreateTaskViewModel.cs @@ -29,6 +29,10 @@ public partial class CreateTaskViewModel : ObservableObject [ObservableProperty] private string _palletBarcode = string.Empty; [ObservableProperty] private string _materialCode = string.Empty; + // ---- 手动操作选项 ---- + [ObservableProperty] private bool _manualPutIn; + [ObservableProperty] private bool _manualTakeOut; + // ---- 状态 ---- [ObservableProperty] private string _statusText = string.Empty; [ObservableProperty] private bool _isBusy; @@ -60,7 +64,8 @@ public partial class CreateTaskViewModel : ObservableObject StartBuilding, StartFloor, StartLocation, EndBuilding, EndFloor, EndLocation, TaskType, TaskCategory, - PalletBarcode, MaterialCode)); + PalletBarcode, MaterialCode, + ManualPutIn, ManualTakeOut)); StatusText = $"路由生成完成,共 {taskQueue.taskSteps} 条明细,正在保存..."; diff --git a/Sln.Wcs.UI/Views/Task/CreateTaskView.axaml b/Sln.Wcs.UI/Views/Task/CreateTaskView.axaml index 3d58872..3629e45 100644 --- a/Sln.Wcs.UI/Views/Task/CreateTaskView.axaml +++ b/Sln.Wcs.UI/Views/Task/CreateTaskView.axaml @@ -75,6 +75,12 @@ + + + + + +