using System.Globalization;
using System.Text.Json;
namespace JiDangJia.Core;
public sealed class DbRow : Dictionary<string, object?>
{
public DbRow() : base(StringComparer.OrdinalIgnoreCase) { }
public DbRow(IDictionary<string, object?> 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<string, string> ItemTypes = new()
{ ["GOLD"]="黄金", ["SILVER"]="白银", ["PLATINUM"]="铂金", ["PALLADIUM"]="钯金", ["METAL"]="贵金属", ["LUXURY"]="奢侈品", ["JEWELRY"]="珠宝/饰品", ["WATCH"]="名表", ["ELECTRONICS"]="电子产品", ["VEHICLE"]="车辆", ["PROPERTY"]="房产", ["OTHER"]="其他" };
public static readonly Dictionary<string, string> 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<string, string> 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<string> 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<string,string> 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);
}
using System.Globalization;
using System.Text.Json;
namespace JiDangJia.Core;
public sealed class DbRow : Dictionary<string, object?>
{
public DbRow() : base(StringComparer.OrdinalIgnoreCase) { }
public DbRow(IDictionary<string, object?> 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<string, string> ItemTypes = new()
{ ["GOLD"]="黄金", ["SILVER"]="白银", ["PLATINUM"]="铂金", ["PALLADIUM"]="钯金", ["METAL"]="贵金属", ["LUXURY"]="奢侈品", ["JEWELRY"]="珠宝/饰品", ["WATCH"]="名表", ["ELECTRONICS"]="电子产品", ["VEHICLE"]="车辆", ["PROPERTY"]="房产", ["OTHER"]="其他" };
public static readonly Dictionary<string, string> 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<string, string> 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<string> 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<string,string> 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);
}