InboundProductionSearchViewModel.cs 3.1 KB
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using IndustrialControl.Pages;
using IndustrialControl.Services;
using System;
using System.Collections.ObjectModel;

namespace IndustrialControl.ViewModels;

public partial class InboundProductionSearchViewModel : ObservableObject
{
    private readonly IInboundMaterialService _dataSvc;
    [ObservableProperty] private string? searchOrderNo;
    [ObservableProperty] private DateTime startDate = DateTime.Today;
    [ObservableProperty] private DateTime endDate = DateTime.Today;
    [ObservableProperty] private InboundOrderSummary? selectedOrder;
    private CancellationTokenSource? _searchCts;

    public InboundProductionSearchViewModel(IInboundMaterialService dataSvc)
    {
        _dataSvc = dataSvc;
        Orders = new ObservableCollection<InboundOrderSummary>();
    }



    public ObservableCollection<InboundOrderSummary> Orders { get; }

    [RelayCommand]
    private async Task SearchAsync()
    {
        _searchCts?.Cancel();
        _searchCts = new CancellationTokenSource();
        var ct = _searchCts.Token;
        try
        {
          
            var list = await _dataSvc.ListInboundOrdersAsync(
                searchOrderNo,           // 单号/条码
                startDate,               // 开始日期
                endDate,                 // 结束日期(Service 内会扩到 23:59:59)
                "in_production",                    // 不传单值 orderType,用 null 更清晰
                null,           // 多类型数组
                ct                       // ← 新增:取消令牌
             );
            // ★ 在主线程更新 ObservableCollection,避免看起来“没刷新”
            await MainThread.InvokeOnMainThreadAsync(() =>
            {
                Orders.Clear();
                if (list != null)
                {
                    foreach (var o in list)
                        Orders.Add(o);
                }
            });

            // (排查辅助)无数据时提示一下,确认命令确实执行了
            if (list == null || !list.Any())
                await Shell.Current.DisplayAlert("提示", "未查询到任何入库单", "确定");
        }
        catch (Exception ex)
        {
            await Shell.Current.DisplayAlert("查询失败", ex.Message, "确定");
        }
    }

    [RelayCommand(CanExecute = nameof(CanGoInbound))]
    private async Task GoInboundAsync(InboundOrderSummary? item)
    {
        if (item is null) return;

        static string E(string? v) => Uri.EscapeDataString(v ?? "");

        var o = item;
        var url =
            $"//InboundProduction" +
            $"?instockId={E(o.instockId)}" +
            $"&instockNo={E(o.instockNo)}" +
            $"&orderType={E(o.orderType)}" +
            $"&orderTypeName={E(o.orderTypeName)}" +
            $"&purchaseNo={E(o.purchaseNo)}" +
            $"&supplierName={E(o.supplierName)}" +
            $"&createdTime={E(o.createdTime)}";

        await Shell.Current.GoToAsync(url);
    }

    // ✅ 与命令同签名的 CanExecute
    private bool CanGoInbound(InboundOrderSummary? item) => item != null;

}