OutboundMaterialPage.xaml.cs
4.7 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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
using IndustrialControl.Services;
using IndustrialControl.ViewModels;
namespace IndustrialControl.Pages;
[QueryProperty(nameof(OutstockId), "outstockId")]
[QueryProperty(nameof(OutstockNo), "outstockNo")]
[QueryProperty(nameof(RequisitionMaterialNo), "requisitionMaterialNo")]
[QueryProperty(nameof(WorkOrderNo), "workOrderNo")]
[QueryProperty(nameof(Memo), "memo")]
public partial class OutboundMaterialPage : ContentPage
{
private readonly ScanService _scanSvc;
private readonly OutboundMaterialViewModel _vm;
public string? OutstockId { get; set; }
public string? OutstockNo { get; set; }
public string? RequisitionMaterialNo { get; set; }
public string? WorkOrderNo { get; set; }
public string? Memo { get; set; }
private readonly IDialogService _dialogs;
public OutboundMaterialPage(OutboundMaterialViewModel vm, ScanService scanSvc, IDialogService dialogs)
{
InitializeComponent();
BindingContext = vm;
_scanSvc = scanSvc;
_vm = vm;
_dialogs = dialogs;
// 可选:配置前后缀与防抖
_scanSvc.Prefix = null; // 例如 "}q" 之类的前缀;没有就留 null
// _scanSvc.Suffix = "\n"; // 如果设备会附带换行,可去掉;没有就设 null
//_scanSvc.DebounceMs = 250;
_scanSvc.Suffix = null; // 先关掉
_scanSvc.DebounceMs = 0; // 先关掉
}
protected override async void OnAppearing()
{
base.OnAppearing();
// ✅ 用搜索页带过来的基础信息初始化页面,并拉取两张表
if (!string.IsNullOrWhiteSpace(OutstockId))
{
await _vm.InitializeFromSearchAsync(
outstockId: OutstockId ?? "",
outstockNo: OutstockNo ?? "",
requisitionMaterialNo: RequisitionMaterialNo ?? "",
workOrderNo: WorkOrderNo ?? "",
memo: Memo ?? ""
);
}
_scanSvc.Scanned += OnScanned;
_scanSvc.StartListening();
_scanSvc.Attach(ScanEntry);
ScanEntry.Focus();
}
/// <summary>
/// 清空扫描记录
/// </summary>
void OnClearClicked(object sender, EventArgs e)
{
_vm.ClearScan();
ScanEntry.Text = string.Empty;
ScanEntry.Focus();
}
protected override void OnDisappearing()
{
// 退出页面即注销(防止多个程序/页面抢处理)
_scanSvc.Scanned -= OnScanned;
_scanSvc.StopListening();
base.OnDisappearing();
}
private void OnScanned(string data, string type)
{
MainThread.BeginInvokeOnMainThread(async () =>
{
// 常见处理:自动填入单号/条码并触发查询或加入明细
_vm.ScanCode = data;
// 你原本的逻辑:若识别到是订单号 → 查询;若是包装码 → 加入列表等
await _vm.HandleScannedAsync(data, type);
});
}
/// <summary>
/// 确认入库按钮点击
/// </summary>
async void OnConfirmClicked(object sender, EventArgs e)
{
var ok = await _vm.ConfirmOutboundAsync();
if (ok)
{
await DisplayAlert("提示", "入库成功", "确定");
_vm.ClearAll();
// ✅ 返回到工单查询页面(InboundMaterialSearchPage)
await Shell.Current.GoToAsync($"//{nameof(OutboundMaterialSearchPage)}");
}
else
{
await DisplayAlert("提示", "入库失败,请检查数据", "确定");
}
}
private async void OnBinTapped(object? sender, TappedEventArgs e)
{
var bindable = sender as BindableObject;
var row = bindable?.BindingContext;
if (row == null) return;
var type = row.GetType();
var currentBin = type.GetProperty("Location")?.GetValue(row)?.ToString();
// 1) 打开公共组件选择库位(你已完成的组件)
var picked = await BinPickerPage.ShowAsync(currentBin);
if (picked == null) return;
// 2) 调用 VM:带上行对象 + 选中的 BinInfo,内部会调接口 & 回填行
await _vm.UpdateRowLocationAsync(row, picked);
}
private async void OnQtyCompleted(object sender, EventArgs e)
{
if (sender is not Entry entry) return;
if (entry.BindingContext is not IndustrialControl.ViewModels.OutScannedItem row) return;
// 只看 ScanStatus:未通过则不提交
if (!row.ScanStatus)
{
await DisplayAlert("提示", "该行尚未扫描通过,不能修改数量。", "确定");
return;
}
await _vm.UpdateQuantityForRowAsync(row);
}
}