InboundProductionViewModel.cs 4.0 KB
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using IndustrialControl.Services;
using System.Collections.ObjectModel;

namespace IndustrialControl.ViewModels
{
    public partial class InboundProductionViewModel : ObservableObject
    {
        [ObservableProperty] private string? scanCode;
        private readonly IWarehouseDataService _warehouseSvc;

        public InboundProductionViewModel(IWarehouseDataService warehouseSvc)
        {
            _warehouseSvc = warehouseSvc;

            ConfirmCommand = new AsyncRelayCommand(ConfirmInboundAsync);

            // 测试数据
            Lines = new ObservableCollection<ProductionScanItem>
            {
                new ProductionScanItem { IsSelected = false, Barcode="FSC2025060300001", Bin="CK1_A201", Qty=1 },
                new ProductionScanItem { IsSelected = false, Barcode="FSC2025060300002", Bin="CK1_A201", Qty=1 }
            };

            AvailableBins = new ObservableCollection<string>
            {
                "CK1_A201", "CK1_A202", "CK1_A203"
            };
        }

        // 基础信息
        [ObservableProperty] private string orderNo;
        [ObservableProperty] private string workOrderNo;
        [ObservableProperty] private string productName;
        [ObservableProperty] private int pendingQty;

        public ObservableCollection<ProductionScanItem> Lines { get; set; }
        public ObservableCollection<string> AvailableBins { get; set; }

        public IAsyncRelayCommand ConfirmCommand { get; }

        public void ClearScan()
        {
            Lines.Clear();
        }

        public void ClearAll()
        {
            OrderNo = string.Empty;
            WorkOrderNo = string.Empty;
            ProductName = string.Empty;
            PendingQty = 0;
            Lines.Clear();
        }

        public void PassSelectedScan()
        {
            foreach (var item in Lines)
            {
                if (item.IsSelected)
                {
                    // 扫描通过处理
                }
            }
        }

        public void CancelSelectedScan()
        {
            for (int i = Lines.Count - 1; i >= 0; i--)
            {
                if (Lines[i].IsSelected)
                    Lines.RemoveAt(i);
            }
        }

        public async Task<bool> ConfirmInboundAsync()
        {
            if (string.IsNullOrWhiteSpace(OrderNo))
                return false;

            var result = await _warehouseSvc.ConfirmInboundProductionAsync(OrderNo,
                Lines.Select(x => new ScanItem(0, x.Barcode, x.Bin, x.Qty)));

            return result.Succeeded;
        }

        public async Task HandleScannedAsync(string data, string symbology)
        {
            // TODO: 你的规则(判断是订单号/物料码/包装码等)
            //      然后:查询接口 / 加入列表 / 自动提交
            await Task.CompletedTask;
        }

        public async Task LoadOrderAsync(string orderNo)
        {
            // 0) 清空旧数据
            ClearAll();

            // 1) 基础信息
            var order = await _warehouseSvc.GetInboundOrderAsync(orderNo);
            OrderNo = order.OrderNo;
            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";
        }
    }

    public class ProductionScanItem
    {
        public bool IsSelected { get; set; }
        public string Barcode { get; set; }
        public string Bin { get; set; }
        public int Qty { get; set; }
    }
}