|
...
|
...
|
@@ -16,7 +16,11 @@ namespace IndustrialControl.ViewModels |
|
|
|
"CK1_A203",
|
|
|
|
"CK1_A204"
|
|
|
|
};
|
|
|
|
public ObservableCollection<OutScannedItem> ScannedList { get; }
|
|
|
|
public ObservableCollection<PendingItem> PendingList { get; set; }
|
|
|
|
|
|
|
|
[ObservableProperty]
|
|
|
|
private OutScannedItem? selectedScanItem;
|
|
|
|
|
|
|
|
public InboundMaterialViewModel(IWarehouseDataService warehouseSvc)
|
|
|
|
{
|
|
...
|
...
|
@@ -62,8 +66,7 @@ namespace IndustrialControl.ViewModels |
|
|
|
[ObservableProperty] private string scannedTextColor = "#333333";
|
|
|
|
|
|
|
|
// 列表数据
|
|
|
|
public ObservableCollection<PendingItem> PendingList { get; set; }
|
|
|
|
public ObservableCollection<OutScannedItem> ScannedList { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
// 命令
|
|
|
|
public IRelayCommand ShowPendingCommand { get; }
|
|
...
|
...
|
@@ -115,34 +118,63 @@ namespace IndustrialControl.ViewModels |
|
|
|
ScannedList.Clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 扫描通过逻辑
|
|
|
|
/// </summary>
|
|
|
|
public void PassSelectedScan()
|
|
|
|
[RelayCommand]
|
|
|
|
private async Task PassScan() // 绑定到 XAML 的 PassScanCommand
|
|
|
|
{
|
|
|
|
foreach (var item in ScannedList)
|
|
|
|
var selected = ScannedList.Where(x => x.IsSelected).ToList();
|
|
|
|
|
|
|
|
if (selected.Count == 0)
|
|
|
|
{
|
|
|
|
if (item.IsSelected)
|
|
|
|
{
|
|
|
|
// 这里可以做业务处理,比如更新状态
|
|
|
|
}
|
|
|
|
await ShowTip("请先勾选一行记录。");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (selected.Count > 1)
|
|
|
|
{
|
|
|
|
await ShowTip("一次只能操作一行,请只勾选一行。");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var row = selected[0];
|
|
|
|
row.Qty += 1;
|
|
|
|
|
|
|
|
// 确保本行已变绿(如果你的行颜色基于 IsSelected)
|
|
|
|
if (!row.IsSelected) row.IsSelected = true;
|
|
|
|
SelectedScanItem = row;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 取消扫描逻辑
|
|
|
|
/// </summary>
|
|
|
|
public void CancelSelectedScan()
|
|
|
|
[RelayCommand]
|
|
|
|
private async Task CancelScan() // 绑定到 XAML 的 CancelScanCommand
|
|
|
|
{
|
|
|
|
for (int i = ScannedList.Count - 1; i >= 0; i--)
|
|
|
|
var selected = ScannedList.Where(x => x.IsSelected).ToList();
|
|
|
|
|
|
|
|
if (selected.Count == 0)
|
|
|
|
{
|
|
|
|
await ShowTip("请先勾选一行记录。");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (selected.Count > 1)
|
|
|
|
{
|
|
|
|
if (ScannedList[i].IsSelected)
|
|
|
|
{
|
|
|
|
ScannedList.RemoveAt(i);
|
|
|
|
}
|
|
|
|
await ShowTip("一次只能操作一行,请只勾选一行。");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var row = selected[0];
|
|
|
|
if (row.Qty <= 0)
|
|
|
|
{
|
|
|
|
await ShowTip("该行数量已为 0,无法再减少。");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
row.Qty -= 1;
|
|
|
|
|
|
|
|
// 如果希望数量减到 0 时取消高亮,可打开下一行
|
|
|
|
// if (row.Qty == 0) row.IsSelected = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
private Task ShowTip(string message) =>
|
|
|
|
Shell.Current?.DisplayAlert("提示", message, "确定") ?? Task.CompletedTask;
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 确认入库逻辑
|
|
|
|
/// </summary>
|
|
...
|
...
|
@@ -156,6 +188,55 @@ namespace IndustrialControl.ViewModels |
|
|
|
|
|
|
|
return result.Succeeded;
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task LoadOrderAsync(string orderNo)
|
|
|
|
{
|
|
|
|
// 0) 清空旧数据
|
|
|
|
ClearAll();
|
|
|
|
|
|
|
|
// 1) 基础信息
|
|
|
|
var order = await _warehouseSvc.GetInboundOrderAsync(orderNo);
|
|
|
|
OrderNo = order.OrderNo;
|
|
|
|
Supplier = order.Supplier ?? string.Empty;
|
|
|
|
LinkedDeliveryNo = order.LinkedNo ?? string.Empty; // 到货/交货单
|
|
|
|
LinkedPurchaseNo = order is { } ? LinkedPurchaseNo : ""; // 你没有就留空
|
|
|
|
|
|
|
|
// 2) 预入库库位:从接口取(先 mock),用于行内 Picker
|
|
|
|
// (你已经在 IWarehouseDataService 里加了 ListInboundBinsAsync)
|
|
|
|
try
|
|
|
|
{
|
|
|
|
var bins = await _warehouseSvc.ListInboundBinsAsync(orderNo);
|
|
|
|
AvailableBins.Clear();
|
|
|
|
foreach (var b in bins) AvailableBins.Add(b);
|
|
|
|
}
|
|
|
|
catch
|
|
|
|
{
|
|
|
|
// 兜底:本地 mock,避免空集合导致 Picker 无选项
|
|
|
|
AvailableBins.Clear();
|
|
|
|
foreach (var b in new[] { "CK1_A201", "CK1_A202", "CK1_A203", "CK1_A204" })
|
|
|
|
AvailableBins.Add(b);
|
|
|
|
}
|
|
|
|
var defaultBin = AvailableBins.FirstOrDefault() ?? "CK1_A201";
|
|
|
|
|
|
|
|
// 3) 待入库明细:如果暂时没有后端接口,这里先 mock 多行,便于 UI 联调
|
|
|
|
PendingList.Clear();
|
|
|
|
// 你原来只加了 1 行,这里多给两行方便测试
|
|
|
|
PendingList.Add(new PendingItem { Name = "物料X", Spec = "型号X", PendingQty = order.ExpectedQty, Bin = defaultBin, ScannedQty = 0 });
|
|
|
|
PendingList.Add(new PendingItem { Name = "物料Y", Spec = "型号Y", PendingQty = Math.Max(10, order.ExpectedQty / 2), Bin = defaultBin, ScannedQty = 0 });
|
|
|
|
PendingList.Add(new PendingItem { Name = "物料Z", Spec = "型号Z", PendingQty = 8, Bin = defaultBin, ScannedQty = 0 });
|
|
|
|
|
|
|
|
// 4) 扫描明细初始化(为空即可;也可以放 1~2 条便于测试)
|
|
|
|
ScannedList.Clear();
|
|
|
|
// 可选:放两条测试数据,验证“库位下拉/数量可编辑”
|
|
|
|
ScannedList.Add(new OutScannedItem { IsSelected = false, Barcode = "FSC2025060300001", Name = "物料X", Spec = "型号X", Bin = defaultBin, Qty = 1 });
|
|
|
|
ScannedList.Add(new OutScannedItem { IsSelected = false, Barcode = "FSC2025060300002", Name = "物料Y", Spec = "型号Y", Bin = defaultBin, Qty = 2 });
|
|
|
|
|
|
|
|
// 5) 默认展示“待入库明细”页签
|
|
|
|
SwitchTab(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 待入库明细模型
|
|
...
|
...
|
@@ -169,14 +250,14 @@ namespace IndustrialControl.ViewModels |
|
|
|
}
|
|
|
|
|
|
|
|
// 扫描明细模型
|
|
|
|
public class OutScannedItem
|
|
|
|
public partial class OutScannedItem : ObservableObject
|
|
|
|
{
|
|
|
|
public bool IsSelected { get; set; }
|
|
|
|
public string Barcode { get; set; }
|
|
|
|
public string Name { get; set; }
|
|
|
|
public string Spec { get; set; }
|
|
|
|
public string Bin { get; set; }
|
|
|
|
public int Qty { get; set; }
|
|
|
|
[ObservableProperty] private bool isSelected;
|
|
|
|
[ObservableProperty] private string barcode;
|
|
|
|
[ObservableProperty] private string name;
|
|
|
|
[ObservableProperty] private string spec;
|
|
|
|
[ObservableProperty] private string bin;
|
|
|
|
[ObservableProperty] private int qty;
|
|
|
|
}
|
|
|
|
|
|
|
|
} |
...
|
...
|
|