OutboundMaterialSearchViewModel.cs 3.2 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 OutboundMaterialSearchViewModel : ObservableObject
{
    private readonly IOutboundMaterialService _dataSvc;
    [ObservableProperty] private string? searchOrderNo;
    [ObservableProperty] private DateTime startDate = DateTime.Today;
    [ObservableProperty] private DateTime endDate = DateTime.Today;
    [ObservableProperty] private OutboundOrderSummary? selectedOrder;
    private CancellationTokenSource? _searchCts;
    public OutboundMaterialSearchViewModel(IOutboundMaterialService dataSvc)
    {
        _dataSvc = dataSvc;
        Orders = new ObservableCollection<OutboundOrderSummary>();
    }



    public ObservableCollection<OutboundOrderSummary> Orders { get; }

    [RelayCommand]
    private async Task SearchAsync()
    {
        _searchCts?.Cancel();
        _searchCts = new CancellationTokenSource();
        var ct = _searchCts.Token;
        try
        {
            var orderTypeList = new[] { "out_return", "out_return", "out_other" };
            var list = await _dataSvc.ListOutboundOrdersAsync(SearchOrderNo, startDate, endDate, null, orderTypeList,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(CanGoOutbound))]
    private async Task GoOutboundAsync(OutboundOrderSummary? item)
    {
        if (SelectedOrder is null) return;

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

        var o = SelectedOrder; // 确保 SelectedOrder 包含以下字段
        var url =
            $"//OutboundMaterial" +
            $"?outstockId={E(o.outstockId)}" +
            $"&outstockNo={E(searchOrderNo)}" +
            $"&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);
    }
    private bool CanGoOutbound(OutboundOrderSummary? item) => item != null;
}
public record OutboundOrderSummary(
    string outstockId,
    string orderType,
    string orderTypeName,
    string purchaseNo,
    string supplierName,
    string arrivalNo,
    string createdTime,
    string deliveryNo,
    string requisitionMaterialNo,
    string returnNo,
    string workOrderNo
);