using System.Globalization; using System.Text.Json; namespace JiDangJia.Core; public sealed class DbRow : Dictionary { public DbRow() : base(StringComparer.OrdinalIgnoreCase) { } public DbRow(IDictionary values) : base(values, StringComparer.OrdinalIgnoreCase) { } public string Text(string key, string fallback = "") => TryGetValue(key, out var v) && v is not null ? Convert.ToString(v, CultureInfo.InvariantCulture) ?? fallback : fallback; public decimal Money(string key) => decimal.TryParse(Text(key), NumberStyles.Any, CultureInfo.InvariantCulture, out var n) ? n : 0; public int Int(string key) => (int)Money(key); public DateTime Date(string key) => DateTime.TryParse(Text(key), CultureInfo.InvariantCulture, DateTimeStyles.None, out var d) ? d : DateTime.Today; public string Id => Text("id"); public static DbRow FromJson(JsonElement element) { var row = new DbRow(); foreach (var p in element.EnumerateObject()) row[p.Name] = p.Value.ValueKind switch { JsonValueKind.Null => null, JsonValueKind.Number => p.Value.GetDecimal(), JsonValueKind.True => 1, JsonValueKind.False => 0, JsonValueKind.String => p.Value.GetString(), _ => p.Value.GetRawText() }; return row; } } public static class Display { public static string Money(decimal value) => "¥" + value.ToString("N2", CultureInfo.InvariantCulture); public static string Day(DateTime value) => value.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture); public static readonly Dictionary ItemTypes = new() { ["GOLD"]="黄金", ["SILVER"]="白银", ["PLATINUM"]="铂金", ["PALLADIUM"]="钯金", ["METAL"]="贵金属", ["LUXURY"]="奢侈品", ["JEWELRY"]="珠宝/饰品", ["WATCH"]="名表", ["ELECTRONICS"]="电子产品", ["VEHICLE"]="车辆", ["PROPERTY"]="房产", ["OTHER"]="其他" }; public static readonly Dictionary Statuses = new() { ["ACTIVE"]="活当", ["DUE_SOON"]="即将到期", ["OVERDUE"]="已逾期", ["REDEEMED"]="已赎当", ["DEAD"]="已绝当", ["DONE"]="已完成", ["VOID"]="已作废", ["CANCELLED"]="已作废", ["IN_STOCK"]="在库", ["LISTED"]="在售", ["SOLD"]="已售", ["RENTED"]="租赁中", ["OVERDUE_RENT"]="逾期滞还", ["LOST"]="未归还,已售结算", ["OPEN"]="进行中", ["RETURNED"]="已归还", ["SCRAPPED"]="已报废" }; public static readonly Dictionary Categories = new() { ["INTEREST"]="利息收入", ["STORAGE_FEE"]="保管费", ["C_FEE"]="综合服务费", ["DIFF"]="差额收入", ["PENALTY_IN"]="违约金", ["PRINCIPAL_IN"]="赎回本金", ["PAWN_OUT"]="开当放款", ["RECYCLE_OUT"]="回收支出", ["STOCK_OUT"]="铺货支出", ["STOCK_REFUND"]="入库款退回", ["SALE_REFUND"]="销售退款", ["SALE_IN"]="库存销售", ["RENT_IN"]="租赁收入", ["CONSIGN_IN"]="寄卖佣金", ["OTHER_IN"]="其他收入", ["RENT"]="店铺租金", ["SALARY"]="员工工资", ["OTHER_OUT"]="其他支出", ["RECYCLE_COST"]="回收支出", ["RECOVERY"]="回收销售收入", ["DEAD_SALE"]="绝当处置收入", ["PURCHASE"]="代购收入", ["PURCHASE_COST"]="代购成本", ["APPRAISAL"]="鉴定收入", ["UTILITIES"]="水电费", ["OTHER_INCOME"]="其他收入", ["OTHER_EXPENSE"]="其他支出", ["DEPOSIT_IN"]="收取租赁押金", ["DEPOSIT_REFUND"]="退还租赁押金", ["CONSIGN_SALE"]="寄卖销售收入", ["CONSIGN_PAYOUT"]="寄卖客户结算" }; public static readonly HashSet ExpenseCategories = ["PAWN_OUT","RECYCLE_OUT","STOCK_OUT","SALE_REFUND","RENT","SALARY","OTHER_OUT","RECYCLE_COST","PURCHASE_COST","UTILITIES","OTHER_EXPENSE","DEPOSIT_REFUND","CONSIGN_PAYOUT","FUNDING_COST"]; static Display() { Categories["FUNDING_COST"]="资金成本"; Actions["FUNDING_SAVE"]="登记资方资金";Actions["FUNDING_SETTLE"]="结算资金成本";Actions["FUNDING_END"]="停止资金计息"; } public static readonly Dictionary Actions=new(){["PAWN_OPEN"]="开当",["REDEEM"]="赎当",["RENEW"]="续当",["DEAD"]="绝当",["RECYCLE"]="回收入库",["STOCK_PURCHASE"]="铺货入库",["SALE"]="销售",["SALE_VOID"]="作废销售",["INTAKE_VOID"]="作废入库",["BUSINESS_OPEN"]="新建业务",["BUSINESS_CLOSE"]="业务结算",["BUSINESS_VOID"]="作废业务",["CUSTOMER_SAVE"]="保存客户",["BOOK"]="手工记账",["LIST"]="库存上架",["SAVE"]="保存设置",["DELETE"]="移入回收站",["RESTORE"]="还原记录",["BACKUP_IMPORT"]="导入备份",["REGISTER"]="账户注册",["LOGIN"]="账户登录",["CARD_ISSUE"]="生成卡密",["CARD_ACTIVATE"]="兑换卡密",["CARD_STATUS"]="修改卡密状态",["ACCOUNT_STATUS"]="修改账户状态",["LICENSE_STATUS"]="修改授权状态",["PASSWORD_CHANGE"]="修改密码",["PASSWORD_RESET"]="重置密码"}; public static string Action(string key)=>Actions.GetValueOrDefault(key,key); public static string Category(string key) => key=="RENT_SALE_BALANCE"?"未归还设备售价补款":Categories.GetValueOrDefault(key, key); public static string Item(string key) => ItemTypes.GetValueOrDefault(key, key); public static string Status(string key) => Statuses.GetValueOrDefault(key, key); }