Platform upgrade: login auth fix, OCR/OSS upload, system menus and dicts, weather dashboard, weighing and invoice modules
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
namespace AgriculturalPlatform.Api.Models;
|
||||
|
||||
/// <summary>通知公告</summary>
|
||||
public class Announcement
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public string Title { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>内容(富文本/纯文本)</summary>
|
||||
public string Content { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>类型(数据字典 announcement_type:notice=通知 announce=公告)</summary>
|
||||
public string Type { get; set; } = "notice";
|
||||
|
||||
/// <summary>发布范围组织 Id(逗号分隔;空=全部可见)</summary>
|
||||
public string ScopeOrgIds { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>是否置顶</summary>
|
||||
public bool IsPinned { get; set; }
|
||||
|
||||
/// <summary>发布人</summary>
|
||||
public int? PublisherId { get; set; }
|
||||
|
||||
public User? Publisher { get; set; }
|
||||
|
||||
public DateTime PublishedAt { get; set; } = DateTime.Now;
|
||||
|
||||
public DateTime CreatedAt { get; set; } = DateTime.Now;
|
||||
}
|
||||
|
||||
/// <summary>公告已读记录</summary>
|
||||
public class AnnouncementRead
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public int AnnouncementId { get; set; }
|
||||
|
||||
public int UserId { get; set; }
|
||||
|
||||
public DateTime ReadAt { get; set; } = DateTime.Now;
|
||||
}
|
||||
@@ -7,6 +7,9 @@ public class Farmer
|
||||
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>姓名拼音首字母(如:张三 → ZS,用于首字母检索)</summary>
|
||||
public string PinyinInitials { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>身份证号(唯一)</summary>
|
||||
public string IdCard { get; set; } = string.Empty;
|
||||
|
||||
|
||||
@@ -23,26 +23,35 @@ public class PurchaseOrder
|
||||
|
||||
public Organization? PurchaserOrg { get; set; }
|
||||
|
||||
/// <summary>等级(一等/二等/三等)</summary>
|
||||
/// <summary>等级(主等级,多等级时为首磅等级;完整多等级见 Weighs)</summary>
|
||||
public string Grade { get; set; } = string.Empty;
|
||||
|
||||
public string Unit { get; set; } = "公斤";
|
||||
|
||||
/// <summary>单价(元/单位)</summary>
|
||||
/// <summary>单价(元/单位,多磅时为首磅单价)</summary>
|
||||
public decimal UnitPrice { get; set; }
|
||||
|
||||
/// <summary>毛重(kg)</summary>
|
||||
/// <summary>毛重(kg,合计)</summary>
|
||||
public decimal GrossWeight { get; set; }
|
||||
|
||||
/// <summary>皮重(kg)</summary>
|
||||
/// <summary>皮重(kg,合计)</summary>
|
||||
public decimal TareWeight { get; set; }
|
||||
|
||||
/// <summary>净重(kg)= 毛重 - 皮重</summary>
|
||||
/// <summary>净重(kg,合计)= 毛重 - 皮重</summary>
|
||||
public decimal NetWeight { get; set; }
|
||||
|
||||
/// <summary>金额(元)= 净重 × 单价</summary>
|
||||
/// <summary>金额(元,合计)= Σ 净重 × 单价</summary>
|
||||
public decimal Amount { get; set; }
|
||||
|
||||
/// <summary>容器/框数合计</summary>
|
||||
public int BoxCount { get; set; }
|
||||
|
||||
/// <summary>磅次(多磅单每磅记录)</summary>
|
||||
public ICollection<PurchaseWeigh> Weighs { get; set; } = new List<PurchaseWeigh>();
|
||||
|
||||
/// <summary>过户记录</summary>
|
||||
public ICollection<PurchaseTransfer> Transfers { get; set; } = new List<PurchaseTransfer>();
|
||||
|
||||
/// <summary>过磅次数:1=已称毛重,2=已回皮完成</summary>
|
||||
public int WeighCount { get; set; }
|
||||
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
namespace AgriculturalPlatform.Api.Models;
|
||||
|
||||
/// <summary>收购票据过户记录</summary>
|
||||
public class PurchaseTransfer
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public int PurchaseOrderId { get; set; }
|
||||
|
||||
public PurchaseOrder? PurchaseOrder { get; set; }
|
||||
|
||||
/// <summary>过户单号(如 GH20260812-0001)</summary>
|
||||
public string TransferNo { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>原农户(快照)</summary>
|
||||
public string FromFarmer { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>过户到农户(名称快照)</summary>
|
||||
public string ToFarmer { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>过户到农户身份证</summary>
|
||||
public string ToIdCard { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>过户原因</summary>
|
||||
public string Reason { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>经办人</summary>
|
||||
public int? OperatorId { get; set; }
|
||||
|
||||
public User? Operator { get; set; }
|
||||
|
||||
public DateTime CreatedAt { get; set; } = DateTime.Now;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
namespace AgriculturalPlatform.Api.Models;
|
||||
|
||||
/// <summary>收购单-单磅记录(一张收购单支持多磅、多等级)</summary>
|
||||
public class PurchaseWeigh
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public int PurchaseOrderId { get; set; }
|
||||
|
||||
public PurchaseOrder? PurchaseOrder { get; set; }
|
||||
|
||||
/// <summary>磅次序号(第几磅)</summary>
|
||||
public int SortNo { get; set; }
|
||||
|
||||
/// <summary>等级(数据字典 purchase_grade)</summary>
|
||||
public string Grade { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>价格类型:Fixed=固定价 Manual=现场议价 Range=价格区间(数据字典 price_type)</summary>
|
||||
public string PriceType { get; set; } = "Manual";
|
||||
|
||||
/// <summary>单价(元/公斤)</summary>
|
||||
public decimal UnitPrice { get; set; }
|
||||
|
||||
/// <summary>毛重(kg)</summary>
|
||||
public decimal GrossWeight { get; set; }
|
||||
|
||||
/// <summary>皮重(kg)</summary>
|
||||
public decimal TareWeight { get; set; }
|
||||
|
||||
/// <summary>净重(kg)= 毛重 - 皮重</summary>
|
||||
public decimal NetWeight { get; set; }
|
||||
|
||||
/// <summary>容器/框数</summary>
|
||||
public int BoxCount { get; set; }
|
||||
|
||||
/// <summary>金额(元)= 净重 × 单价</summary>
|
||||
public decimal Amount { get; set; }
|
||||
|
||||
public DateTime CreatedAt { get; set; } = DateTime.Now;
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
namespace AgriculturalPlatform.Api.Models;
|
||||
|
||||
/// <summary>数据字典类型</summary>
|
||||
public class SysDict
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
/// <summary>字典名称(如:收购等级)</summary>
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>字典编码(如:purchase_grade / price_type / receipt_format / announcement_type)</summary>
|
||||
public string Code { get; set; } = string.Empty;
|
||||
|
||||
public string Remark { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>系统内置字典不可删除</summary>
|
||||
public bool IsSystem { get; set; }
|
||||
|
||||
public int Sort { get; set; }
|
||||
|
||||
public DateTime CreatedAt { get; set; } = DateTime.Now;
|
||||
|
||||
public ICollection<SysDictItem> Items { get; set; } = new List<SysDictItem>();
|
||||
}
|
||||
|
||||
/// <summary>数据字典项</summary>
|
||||
public class SysDictItem
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public int DictId { get; set; }
|
||||
|
||||
/// <summary>显示名称(如:一等)</summary>
|
||||
public string Label { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>值(如:1)</summary>
|
||||
public string Value { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>扩展属性(如等级对应基准价、票据格式的纸张描述等)</summary>
|
||||
public string Ext { get; set; } = string.Empty;
|
||||
|
||||
public bool IsDefault { get; set; }
|
||||
|
||||
public bool Enabled { get; set; } = true;
|
||||
|
||||
public int Sort { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
namespace AgriculturalPlatform.Api.Models;
|
||||
|
||||
/// <summary>菜单/权限表(目录、菜单、按钮)</summary>
|
||||
public class SysMenu
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public int? ParentId { get; set; }
|
||||
|
||||
/// <summary>菜单名称</summary>
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>路由路径(前端)</summary>
|
||||
public string Path { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>前端组件路径</summary>
|
||||
public string Component { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>图标</summary>
|
||||
public string Icon { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>类型:directory=目录 menu=菜单 button=按钮</summary>
|
||||
public string Type { get; set; } = "menu";
|
||||
|
||||
/// <summary>权限标识(如 purchase:create、purchase:reprint)</summary>
|
||||
public string Permission { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>是否可见(不可见的仅作权限标识)</summary>
|
||||
public bool Visible { get; set; } = true;
|
||||
|
||||
public int Sort { get; set; }
|
||||
|
||||
public DateTime CreatedAt { get; set; } = DateTime.Now;
|
||||
|
||||
public ICollection<SysMenu> Children { get; set; } = new List<SysMenu>();
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
namespace AgriculturalPlatform.Api.Models;
|
||||
|
||||
/// <summary>角色</summary>
|
||||
public class SysRole
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public string Name { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>角色编码(如 super_admin / company_admin / station_staff / viewer)</summary>
|
||||
public string Code { get; set; } = string.Empty;
|
||||
|
||||
public string Description { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>系统内置角色不可删除</summary>
|
||||
public bool IsSystem { get; set; }
|
||||
|
||||
public DateTime CreatedAt { get; set; } = DateTime.Now;
|
||||
}
|
||||
|
||||
/// <summary>角色-菜单关联</summary>
|
||||
public class SysRoleMenu
|
||||
{
|
||||
public int RoleId { get; set; }
|
||||
|
||||
public int MenuId { get; set; }
|
||||
}
|
||||
@@ -13,8 +13,14 @@ public class User
|
||||
|
||||
public string Phone { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>兼容旧版角色枚举(新体系以 RoleId 为准)</summary>
|
||||
public UserRole Role { get; set; }
|
||||
|
||||
/// <summary>关联角色(RBAC 权限体系)</summary>
|
||||
public int? RoleId { get; set; }
|
||||
|
||||
public SysRole? SysRole { get; set; }
|
||||
|
||||
/// <summary>所属组织(公司管理员→公司;站员工→站;个体→个体组织)</summary>
|
||||
public int? OrgId { get; set; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user