Platform upgrade: login auth fix, OCR/OSS upload, system menus and dicts, weather dashboard, weighing and invoice modules

This commit is contained in:
2026-08-14 01:12:33 +08:00
parent c377421a3e
commit 8099ebae0a
75 changed files with 5611 additions and 473 deletions
@@ -12,9 +12,22 @@ public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(op
public DbSet<Region> Regions => Set<Region>();
public DbSet<Product> Products => Set<Product>();
public DbSet<PurchaseOrder> PurchaseOrders => Set<PurchaseOrder>();
public DbSet<PurchaseWeigh> PurchaseWeighs => Set<PurchaseWeigh>();
public DbSet<PurchaseTransfer> PurchaseTransfers => Set<PurchaseTransfer>();
public DbSet<PaymentRecord> PaymentRecords => Set<PaymentRecord>();
public DbSet<Invoice> Invoices => Set<Invoice>();
// 系统管理(RBAC
public DbSet<SysDict> SysDicts => Set<SysDict>();
public DbSet<SysDictItem> SysDictItems => Set<SysDictItem>();
public DbSet<SysMenu> SysMenus => Set<SysMenu>();
public DbSet<SysRole> SysRoles => Set<SysRole>();
public DbSet<SysRoleMenu> SysRoleMenus => Set<SysRoleMenu>();
// 通知公告
public DbSet<Announcement> Announcements => Set<Announcement>();
public DbSet<AnnouncementRead> AnnouncementReads => Set<AnnouncementRead>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
@@ -41,6 +54,9 @@ public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(op
modelBuilder.Entity<User>()
.HasOne(u => u.Org).WithMany().HasForeignKey(u => u.OrgId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<User>()
.HasOne(u => u.SysRole).WithMany().HasForeignKey(u => u.RoleId)
.OnDelete(DeleteBehavior.SetNull);
// 组织
modelBuilder.Entity<Organization>()
@@ -119,6 +135,70 @@ public class AppDbContext(DbContextOptions<AppDbContext> options) : DbContext(op
.HasOne(p => p.Operator).WithMany().HasForeignKey(p => p.OperatorId)
.OnDelete(DeleteBehavior.SetNull);
// 收购单-磅次
modelBuilder.Entity<PurchaseWeigh>()
.HasOne(w => w.PurchaseOrder).WithMany(p => p.Weighs)
.HasForeignKey(w => w.PurchaseOrderId)
.OnDelete(DeleteBehavior.Cascade);
// 票据过户
modelBuilder.Entity<PurchaseTransfer>()
.HasOne(t => t.PurchaseOrder).WithMany(p => p.Transfers)
.HasForeignKey(t => t.PurchaseOrderId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<PurchaseTransfer>()
.HasOne(t => t.Operator).WithMany().HasForeignKey(t => t.OperatorId)
.OnDelete(DeleteBehavior.SetNull);
// 数据字典
modelBuilder.Entity<SysDict>()
.Property(d => d.Code).HasMaxLength(64);
modelBuilder.Entity<SysDict>()
.HasIndex(d => d.Code).IsUnique();
modelBuilder.Entity<SysDict>()
.Property(d => d.Name).HasMaxLength(100);
modelBuilder.Entity<SysDictItem>()
.Property(i => i.Label).HasMaxLength(100);
modelBuilder.Entity<SysDictItem>()
.Property(i => i.Value).HasMaxLength(64);
modelBuilder.Entity<SysDictItem>()
.HasIndex(i => new { i.DictId, i.Value }).IsUnique();
modelBuilder.Entity<SysDict>()
.HasMany(d => d.Items).WithOne().HasForeignKey(i => i.DictId)
.OnDelete(DeleteBehavior.Cascade);
// 菜单(自引用父子关系显式指定外键,避免 EF 推断额外列)
modelBuilder.Entity<SysMenu>()
.Property(m => m.Name).HasMaxLength(100);
modelBuilder.Entity<SysMenu>()
.Property(m => m.Path).HasMaxLength(200);
modelBuilder.Entity<SysMenu>()
.Property(m => m.Permission).HasMaxLength(100);
modelBuilder.Entity<SysMenu>()
.HasIndex(m => m.Permission);
modelBuilder.Entity<SysMenu>()
.HasMany(m => m.Children).WithOne().HasForeignKey(m => m.ParentId)
.OnDelete(DeleteBehavior.Restrict);
// 角色
modelBuilder.Entity<SysRole>()
.Property(r => r.Name).HasMaxLength(100);
modelBuilder.Entity<SysRole>()
.HasIndex(r => r.Code).IsUnique();
modelBuilder.Entity<SysRoleMenu>()
.HasKey(rm => new { rm.RoleId, rm.MenuId });
// 公告
modelBuilder.Entity<Announcement>()
.Property(a => a.Title).HasMaxLength(200);
modelBuilder.Entity<Announcement>()
.HasIndex(a => new { a.Type, a.PublishedAt });
modelBuilder.Entity<Announcement>()
.HasOne(a => a.Publisher).WithMany().HasForeignKey(a => a.PublisherId)
.OnDelete(DeleteBehavior.SetNull);
modelBuilder.Entity<AnnouncementRead>()
.HasIndex(r => new { r.AnnouncementId, r.UserId }).IsUnique();
// 支付
modelBuilder.Entity<PaymentRecord>()
.Property(p => p.PayNo).HasMaxLength(32);