InboundMaterialViewModel.cs 5.7 KB
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using IndustrialControl.Services;
using System.Threading.Tasks;

namespace IndustrialControl.ViewModels
{
    public partial class InboundMaterialViewModel : ObservableObject
    {
        private readonly IWarehouseDataService _warehouseSvc;
        public ObservableCollection<string> AvailableBins { get; set; } = new ObservableCollection<string>
{
    "CK1_A201",
    "CK1_A202",
    "CK1_A203",
    "CK1_A204"
};


        public InboundMaterialViewModel(IWarehouseDataService warehouseSvc)
        {
            _warehouseSvc = warehouseSvc;

            // 初始化命令
            ShowPendingCommand = new RelayCommand(() => SwitchTab(true));
            ShowScannedCommand = new RelayCommand(() => SwitchTab(false));
            ConfirmCommand = new AsyncRelayCommand(ConfirmInboundAsync);

            // 默认显示待入库明细
            IsPendingVisible = true;
            IsScannedVisible = false;

            // 测试数据(上线可去掉)
            PendingList = new ObservableCollection<PendingItem>
            {
                new PendingItem { Name="物料1", Spec="XXX", PendingQty=100, Bin="CK1_A201", ScannedQty=80 },
                new PendingItem { Name="物料2", Spec="YYY", PendingQty=50, Bin="CK1_A202", ScannedQty=0 }
            };

            ScannedList = new ObservableCollection<OutScannedItem>
            {
                new OutScannedItem { IsSelected=false, Barcode="FSC2025060300001", Name="物料1", Spec="XXX", Bin="CK1_A201", Qty=1 },
                new OutScannedItem { IsSelected=false, Barcode="FSC2025060300002", Name="物料1", Spec="XXX", Bin="请选择", Qty=1 }
            };
        }

        // 基础信息
        [ObservableProperty] private string orderNo;
        [ObservableProperty] private string linkedDeliveryNo;
        [ObservableProperty] private string linkedPurchaseNo;
        [ObservableProperty] private string supplier;

        // Tab 显示控制
        [ObservableProperty] private bool isPendingVisible;
        [ObservableProperty] private bool isScannedVisible;

        // Tab 按钮颜色
        [ObservableProperty] private string pendingTabColor = "#E6F2FF";
        [ObservableProperty] private string scannedTabColor = "White";
        [ObservableProperty] private string pendingTextColor = "#007BFF";
        [ObservableProperty] private string scannedTextColor = "#333333";

        // 列表数据
        public ObservableCollection<PendingItem> PendingList { get; set; }
        public ObservableCollection<OutScannedItem> ScannedList { get; set; }

        // 命令
        public IRelayCommand ShowPendingCommand { get; }
        public IRelayCommand ShowScannedCommand { get; }
        public IAsyncRelayCommand ConfirmCommand { get; }

        /// <summary>
        /// 切换 Tab
        /// </summary>
        private void SwitchTab(bool showPending)
        {
            IsPendingVisible = showPending;
            IsScannedVisible = !showPending;

            if (showPending)
            {
                PendingTabColor = "#E6F2FF";
                ScannedTabColor = "White";
                PendingTextColor = "#007BFF";
                ScannedTextColor = "#333333";
            }
            else
            {
                PendingTabColor = "White";
                ScannedTabColor = "#E6F2FF";
                PendingTextColor = "#333333";
                ScannedTextColor = "#007BFF";
            }
        }

        /// <summary>
        /// 清空扫描记录
        /// </summary>
        public void ClearScan()
        {
            ScannedList.Clear();
        }

        /// <summary>
        /// 清空所有数据
        /// </summary>
        public void ClearAll()
        {
            OrderNo = string.Empty;
            LinkedDeliveryNo = string.Empty;
            LinkedPurchaseNo = string.Empty;
            Supplier = string.Empty;
            PendingList.Clear();
            ScannedList.Clear();
        }

        /// <summary>
        /// 扫描通过逻辑
        /// </summary>
        public void PassSelectedScan()
        {
            foreach (var item in ScannedList)
            {
                if (item.IsSelected)
                {
                    // 这里可以做业务处理,比如更新状态
                }
            }
        }

        /// <summary>
        /// 取消扫描逻辑
        /// </summary>
        public void CancelSelectedScan()
        {
            for (int i = ScannedList.Count - 1; i >= 0; i--)
            {
                if (ScannedList[i].IsSelected)
                {
                    ScannedList.RemoveAt(i);
                }
            }
        }

        /// <summary>
        /// 确认入库逻辑
        /// </summary>
        public async Task<bool> ConfirmInboundAsync()
        {
            if (string.IsNullOrWhiteSpace(OrderNo))
                return false;

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

            return result.Succeeded;
        }
    }

    // 待入库明细模型
    public class PendingItem
    {
        public string Name { get; set; }
        public string Spec { get; set; }
        public int PendingQty { get; set; }
        public string Bin { get; set; }
        public int ScannedQty { get; set; }
    }

    // 扫描明细模型
    public class OutScannedItem
    {
        public bool IsSelected { get; set; }
        public string Barcode { get; set; }
        public string Name { get; set; }
        public string Spec { get; set; }
        public string Bin { get; set; }
        public int Qty { get; set; }
    }

}