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"=>"其他入库",_=>"二手回收"};
}
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"=>"其他入库",_=>"二手回收"};
}