DatabaseInitializer.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using SqlSugar;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using TeamAAS_VP.Interfaces;
  8. using TeamAAS_VP.Models;
  9. using TeamAAS_VP.Resources.Languages;
  10. namespace TeamAAS_VP.Data
  11. {
  12. // 数据库初始化实现
  13. public class DatabaseInitializer : IDatabaseInitializer
  14. {
  15. private readonly ISqlSugarClient _db;
  16. public DatabaseInitializer(ISqlSugarClient db)
  17. {
  18. _db = db;
  19. }
  20. public void InitializeDatabase()
  21. {
  22. try
  23. {
  24. // 创建数据库(如果不存在)
  25. _db.DbMaintenance.CreateDatabase();
  26. // 创建表
  27. _db.CodeFirst.InitTables(typeof(User), typeof(ProductionRecord), typeof(UserLoginRecord), typeof(AlarmRecord), typeof(LockResult),
  28. typeof(ScrewFeederBatchRecord), typeof(PhotoCaptureRecord), typeof(HeadChangeRecord),typeof(NozzleChangeRecord), typeof(ThrowRecord), typeof(ProductWithMes));
  29. // 创建索引
  30. CreateIndexes();
  31. // 如果用户表为空,插入三个基础用户
  32. var userCount = _db.Queryable<User>().Count();
  33. if (userCount == 0)
  34. {
  35. var op = new User { UserName = "操作员", UserPassword = "123", userPart = Enums.UserPart.Operator, CreateTime = DateTime.Now, IsRemember = false };
  36. var eng = new User { UserName = "工程师", UserPassword = "123", userPart = Enums.UserPart.Engineer, CreateTime = DateTime.Now, IsRemember = false };
  37. var admin = new User { UserName = "管理员", UserPassword = "team123456", userPart = Enums.UserPart.Administrator, CreateTime = DateTime.Now, IsRemember = false };
  38. _db.Insertable(new List<User> { op, eng, admin }).ExecuteCommand();
  39. }
  40. }
  41. catch (Exception ex)
  42. {
  43. // 记录日志
  44. throw new Exception(string.Format(Lang.数据库初始化失败0,ex.Message), ex);
  45. }
  46. }
  47. public bool DatabaseExists()
  48. {
  49. return _db.DbMaintenance.GetDataBaseList().Contains("AlignerDB");
  50. }
  51. private void CreateIndexes()
  52. {
  53. try
  54. {
  55. // Ensure LockResult indexes for common queries
  56. // 单列索引:Timestamp, ProductNumber, LockPassed
  57. try { _db.DbMaintenance.CreateIndex("LockResult", new string[] { "Timestamp" }, "IX_LockResult_Timestamp", false); } catch { }
  58. try { _db.DbMaintenance.CreateIndex("LockResult", new string[] { "ProductNumber" }, "IX_LockResult_ProductNumber", false); } catch { }
  59. try { _db.DbMaintenance.CreateIndex("LockResult", new string[] { "LockPassed" }, "IX_LockResult_LockPassed", false); } catch { }
  60. // 新增索引:Number, FeederNumber, NozzleNumber
  61. try { _db.DbMaintenance.CreateIndex("LockResult", new string[] { "Number" }, "IX_LockResult_Number", false); } catch { }
  62. try { _db.DbMaintenance.CreateIndex("LockResult", new string[] { "FeederNumber" }, "IX_LockResult_FeederNumber", false); } catch { }
  63. try { _db.DbMaintenance.CreateIndex("LockResult", new string[] { "NozzleNumber" }, "IX_LockResult_NozzleNumber", false); } catch { }
  64. // 复合索引:ProductNumber + Timestamp(支持按产品+时间范围查询)
  65. try { _db.DbMaintenance.CreateIndex("LockResult", new string[] { "ProductNumber", "Timestamp" }, "IX_LockResult_ProductNumber_Timestamp", false); } catch { }
  66. // 你可以在这里为其他表添加索引,例如 ProductionRecord 的 Timestamp 或 ProductName
  67. try { _db.DbMaintenance.CreateIndex("ProductionRecord", new string[] { "ProductName", "Timestamp" }, "IX_ProductionRecord_ProductName_Timestamp", false); } catch { }
  68. // Screw feeder batch records indexes
  69. try { _db.DbMaintenance.CreateIndex("ScrewFeederBatchRecord", new string[] { "ChangeTime" }, "IX_ScrewFeederBatchRecord_ChangeTime", false); } catch { }
  70. try { _db.DbMaintenance.CreateIndex("ScrewFeederBatchRecord", new string[] { "FeederNumber" }, "IX_ScrewFeederBatchRecord_FeederNumber", false); } catch { }
  71. try { _db.DbMaintenance.CreateIndex("ScrewFeederBatchRecord", new string[] { "BatchNumber" }, "IX_ScrewFeederBatchRecord_BatchNumber", false); } catch { }
  72. // Photo capture records indexes
  73. try { _db.DbMaintenance.CreateIndex("PhotoCaptureRecord", new string[] { "CaptureTime" }, "IX_PhotoCaptureRecord_CaptureTime", false); } catch { }
  74. try { _db.DbMaintenance.CreateIndex("PhotoCaptureRecord", new string[] { "RecipeName" }, "IX_PhotoCaptureRecord_RecipeName", false); } catch { }
  75. try { _db.DbMaintenance.CreateIndex("PhotoCaptureRecord", new string[] { "ProductSN" }, "IX_PhotoCaptureRecord_ProductSN", false); } catch { }
  76. // Head change records indexes
  77. try { _db.DbMaintenance.CreateIndex("HeadChangeRecord", new string[] { "ChangeTime" }, "IX_HeadChangeRecord_ChangeTime", false); } catch { }
  78. try { _db.DbMaintenance.CreateIndex("HeadChangeRecord", new string[] { "HeadBatchNumber" }, "IX_HeadChangeRecord_HeadBatchNumber", false); } catch { }
  79. try { _db.DbMaintenance.CreateIndex("PhotoCaptureRecord", new string[] { "CameraName" }, "IX_PhotoCaptureRecord_CameraName", false); } catch { }
  80. // Nozzle change records indexes (same as head)
  81. try { _db.DbMaintenance.CreateIndex("NozzleChangeRecord", new string[] { "ChangeTime" }, "IX_NozzleChangeRecord_ChangeTime", false); } catch { }
  82. try { _db.DbMaintenance.CreateIndex("NozzleChangeRecord", new string[] { "NozzleBatchNumber" }, "IX_NozzleChangeRecord_NozzleBatchNumber", false); } catch { }
  83. }
  84. catch
  85. {
  86. // 忽略索引创建中的错误(如已存在),调用方仍然可以继续
  87. }
  88. }
  89. }
  90. }