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 @@
+
+
+
+
+
+