XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

STHApplication

【MAUI】寄当家——安卓端交易管理系统

公开
关注 0 Fork 0 Star 0
UTF-8
using JiDangJia.Core;

namespace JiDangJia.Views;

public static class InventoryViews
{
    private static View Metrics(params (string label,string value)[] values)
    {
        var grid=new Grid{ColumnSpacing=8};
        for(int i=0;i<values.Length;i++)
        {
            grid.ColumnDefinitions.Add(new(GridLength.Star));var value=Ui.Text(values[i].value,15,bold:true);value.MaxLines=1;value.LineBreakMode=LineBreakMode.TailTruncation;
            if(values[i].value.Length>12)value.FontSize=12;grid.Add(Ui.Stack(Ui.Text(values[i].label,10,Ui.Muted),value),i);
        }
        return grid;
    }
    public static View MetalSummary(string label,List<DbRow> items,Func<IReadOnlyDictionary<string,decimal>> bids,Func<string> quoteStatus,Action<Action> bind,bool holding)
    {
        var value=Ui.Text("—",30,Ui.Bronze,true);var gain=Ui.Text("",13);var foot=Ui.Text("",10,Ui.Muted);
        var totals=InventoryAnalytics.Metal(items,bids());
        var group=Ui.Stack(Ui.Section(label+(holding?"库存估值":"历史库存统计")),Ui.Text(holding?"当前估算价值(元)":"已售物品成本(元)",11,Ui.Muted),value,gain,Ui.Divider(),
            Metrics(("总克重(克)",totals.Weight.ToString("N3")),("总成本(元)",totals.Cost.ToString("N2")),("平均克价(元/克)",totals.Average?.ToString("N2")??"—")),foot);
        void Update()
        {
            var stats=InventoryAnalytics.Metal(items,bids());value.Text=holding?(stats.Value.HasValue?Display.Money(stats.Value.Value):"—"):Display.Money(stats.Cost);
            gain.IsVisible=holding;gain.Text=stats.Gain.HasValue?$"估值收益 {stats.Gain.Value:+#,##0.00;-#,##0.00;0.00} 元  ({stats.Yield.GetValueOrDefault():+0.00;-0.00;0.00}%)":"等待有效克重和行情报价";
            gain.TextColor=stats.Gain.GetValueOrDefault()>=0?Ui.Red:Ui.Green;
            foot.Text=holding?quoteStatus()+(items.Any(i=>i.Money("weight")<=0)?" · 有物品缺少克重":"") : "此处统计已售物品的历史成本与克重";
        }
        bind(Update);Update();return Ui.Card(group,20,shadow:true);
    }
    public static View MetalItem(DbRow item,Func<IReadOnlyDictionary<string,decimal>> bids,Action<Action> bind,bool holding)
    {
        var value=Ui.Text("",11,Ui.Muted);var gain=Ui.Text("",12);var stats=InventoryAnalytics.Metal([item],bids());
        var head=Ui.Spread(Ui.Stack(Ui.Text(item.Text("name"),17,bold:true),Ui.Text(ItemCatalog.ItemName(item)+" · "+Source(item),11,Ui.Muted)),Ui.Text(item.Date("createdAt").ToLocalTime().ToString("yyyy-MM-dd"),10,Ui.Muted));
        var body=Ui.Stack(head,Metrics(("成本(元)",stats.Cost.ToString("N2")),("克重(克)",stats.Weight.ToString("N3")),("均价(元/克)",stats.Average?.ToString("N2")??"—")),Ui.Spread(value,gain));
        if(item.Text("source")=="RENTAL")body.Add(Ui.Pill(Display.Status(item.Text("status"))));
        if(item.Text("itemCode").Length>0)body.Add(Ui.Text("物品编码 "+item.Text("itemCode"),10,Ui.Muted));
        if(item.Text("status")=="LISTED")body.Add(Ui.Text("销售标价 "+Display.Money(item.Money("listedPrice")),12,Ui.Bronze));
        void Update()
        {
            var current=InventoryAnalytics.Metal([item],bids());value.Text=holding?"当前估算价值 "+(current.Value.HasValue?Display.Money(current.Value.Value):"—"):"已售 · 历史成本";
            gain.IsVisible=holding;gain.Text=current.Gain.HasValue?$"{current.Gain.Value:+#,##0.00;-#,##0.00;0.00} 元 ({current.Yield.GetValueOrDefault():+0.00;-0.00;0.00}%)":"等待报价 / 克重";gain.TextColor=current.Gain.GetValueOrDefault()>=0?Ui.Red:Ui.Green;
        }
        bind(Update);Update();return Ui.Card(body);
    }
    public static string Source(DbRow item)=>item.Text("source") switch{"DEAD"=>"绝当转入","PURCHASE"=>"新货铺货","RENTAL"=>"租赁库存","OTHER"=>"其他入库",_=>"二手回收"};
}