InboundProductionPage.xaml.cs 3.7 KB
using IndustrialControl.Services;
using IndustrialControl.ViewModels;

namespace IndustrialControl.Pages
{
    [QueryProperty(nameof(OrderNo), "orderNo")]
    public partial class InboundProductionPage : ContentPage
    {
        private readonly ScanService _scanSvc;
        private readonly InboundProductionViewModel _vm;
        public string? OrderNo { get; set; }

        public InboundProductionPage(InboundProductionViewModel vm, ScanService scanSvc)
        {
            InitializeComponent();
            BindingContext = vm;
            _scanSvc = scanSvc;
            _vm = vm;
            _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();
        }
        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>
        void OnClearClicked(object sender, EventArgs e)
        {
            _vm.ClearScan();
            ScanEntry.Text = string.Empty;
            ScanEntry.Focus();
        }

        /// <summary>
        /// 预留摄像头扫码
        /// </summary>
        async void OnScanClicked(object sender, EventArgs e)
        {
            await DisplayAlert("提示", "此按钮预留摄像头扫码;硬件扫描直接扣扳机。", "确定");
        }

        /// <summary>
        /// 扫描通过
        /// </summary>
        void OnPassScanClicked(object sender, EventArgs e)
        {
            _vm.PassSelectedScan();
        }

        /// <summary>
        /// 取消扫描
        /// </summary>
        void OnCancelScanClicked(object sender, EventArgs e)
        {
            _vm.CancelSelectedScan();
        }

        /// <summary>
        /// 确认入库
        /// </summary>
        async void OnConfirmClicked(object sender, EventArgs e)
        {
            var ok = await _vm.ConfirmInboundAsync();
            if (ok)
            {
                await DisplayAlert("提示", "入库成功", "确定");
                _vm.ClearAll();
            }
            else
            {
                await DisplayAlert("提示", "入库失败,请检查数据", "确定");
            }
        }

        
    }
}