InboundMaterialPage.xaml.cs 3.5 KB
using IndustrialControl.Services;
using IndustrialControl.ViewModels;

namespace IndustrialControl.Pages;

// NEW: 支持从查询页传参
[QueryProperty(nameof(OrderNo), "orderNo")]
public partial class InboundMaterialPage : ContentPage
{
    private readonly ScanService _scanSvc;
    private readonly InboundMaterialViewModel _vm;
    // NEW: 由 Shell 设置
    public string? OrderNo { get; set; }
    private readonly IDialogService _dialogs;

    public InboundMaterialPage(InboundMaterialViewModel 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();

        // 如果带有单号参数,则加载其明细,进入图2/图3的流程
        if (!string.IsNullOrWhiteSpace(OrderNo))
        {
            await _vm.LoadOrderAsync(OrderNo);
        }
        // 动态注册广播接收器(只在当前页面前台时生效)
        _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.ConfirmInboundAsync();
        if (ok)
        {
            await DisplayAlert("提示", "入库成功", "确定");
            _vm.ClearAll();
        }
        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("Bin")?.GetValue(row)?.ToString();

        var picked = await _dialogs.SelectBinAsync(currentBin);
        if (picked == null) return;

        var binProp = type.GetProperty("Bin");
        if (binProp is { CanWrite: true })
            binProp.SetValue(row, picked.BinCode);
        else
            _vm.SetItemBin(row, picked.BinCode);
    }

}