InboundMaterialSearchViewModel.cs
3.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using IndustrialControl.Services;
using System.Collections.ObjectModel;
namespace IndustrialControl.ViewModels;
public partial class InboundMaterialSearchViewModel : ObservableObject
{
private readonly IInboundMaterialService _dataSvc;
[ObservableProperty] private string searchOrderNo;
[ObservableProperty] private DateTime startDate = DateTime.Today;
[ObservableProperty] private DateTime endDate = DateTime.Today;
private CancellationTokenSource? _searchCts;
// 仅用于“高亮选中”
[ObservableProperty] private InboundOrderSummary? selectedOrder;
public InboundMaterialSearchViewModel(IInboundMaterialService dataSvc)
{
_dataSvc = dataSvc;
Orders = new ObservableCollection<InboundOrderSummary>();
}
public ObservableCollection<InboundOrderSummary> Orders { get; }
[RelayCommand]
private async Task SearchAsync()
{
_searchCts?.Cancel();
_searchCts = new CancellationTokenSource();
var ct = _searchCts.Token;
try
{
var orderTypeList = new[] { "in_other", "in_purchase", "in_return" };
var list = await _dataSvc.ListInboundOrdersAsync(
searchOrderNo, // 单号/条码
startDate, // 开始日期
endDate, // 结束日期(Service 内会扩到 23:59:59)
null, // 不传单值 orderType,用 null 更清晰
orderTypeList, // 多类型数组
ct // ← 新增:取消令牌
);
await MainThread.InvokeOnMainThreadAsync(() =>
{
Orders.Clear();
if (list != null)
{
foreach (var o in list)
Orders.Add(o);
}
});
if (list == null || !list.Any())
await Shell.Current.DisplayAlert("提示", "未查询到任何入库单", "确定");
}
catch (Exception ex)
{
await Shell.Current.DisplayAlert("查询失败", ex.Message, "确定");
}
}
// === 方案A:命令接收“当前项”作为参数,不依赖 SelectedOrder ===
[RelayCommand(CanExecute = nameof(CanGoInbound))]
private async Task GoInboundAsync(InboundOrderSummary? item)
{
if (item is null) return;
static string E(string? v) => Uri.EscapeDataString(v ?? "");
var o = item;
await Shell.Current.GoToAsync(
nameof(Pages.InboundMaterialPage),
new Dictionary<string, object>
{
["instockId"] = o.instockId,
["instockNo"] = o.instockNo,
["orderType"] = o.orderType,
["orderTypeName"] = o.orderTypeName,
["purchaseNo"] = o.purchaseNo,
["supplierName"] = o.supplierName,
["arrivalNo"] = o.arrivalNo,
["createdTime"] = o.createdTime
});
}
// 与命令同签名的 CanExecute
private bool CanGoInbound(InboundOrderSummary? item) => item != null;
}
// 用于列表显示的精简 DTO
public record InboundOrderSummary(
string instockId,
string instockNo,
string orderType,
string orderTypeName,
string purchaseNo,
string supplierName,
string arrivalNo,
string workOrderNo,
string materialName,
int instockQty,
string createdTime
);