diff --git a/Libs/CMS_CORE_Library.dll b/Libs/CMS_CORE_Library.dll index 32aad16e..91175856 100644 Binary files a/Libs/CMS_CORE_Library.dll and b/Libs/CMS_CORE_Library.dll differ diff --git a/Step.Config/Config/maintenancesConfig.xml b/Step.Config/Config/maintenancesConfig.xml index 9fd253d5..9d4f37ad 100644 --- a/Step.Config/Config/maintenancesConfig.xml +++ b/Step.Config/Config/maintenancesConfig.xml @@ -6,7 +6,10 @@ Test Ita - 5000 + 10 + 01/12/1999 + interval + 1 2 @@ -14,6 +17,9 @@ Test Ita - 5000 + 2500 + 01/12/1999 + exp_date + 2 \ No newline at end of file diff --git a/Step.Config/Config/maintenancesConfigValidator.xsd b/Step.Config/Config/maintenancesConfigValidator.xsd index 0cc0438e..443327aa 100644 --- a/Step.Config/Config/maintenancesConfigValidator.xsd +++ b/Step.Config/Config/maintenancesConfigValidator.xsd @@ -21,7 +21,10 @@ - + + + + diff --git a/Step.Config/ServerConfigController.cs b/Step.Config/ServerConfigController.cs index ec0d4fa6..c2c29c96 100644 --- a/Step.Config/ServerConfigController.cs +++ b/Step.Config/ServerConfigController.cs @@ -65,7 +65,10 @@ namespace Step.Config LocalizedNames = x.Element("localizedNames").Elements().ToDictionary( // Read names list y => y.Attribute("langKey").Value, y => y.Value ), - count = Convert.ToInt32(x.Element("interval").Value) + Intervall = TimeSpan.FromHours(Convert.ToDouble(x.Element("interval").Value)), + Deadline = DateTime.Parse(x.Element("deadline").Value), + Type = x.Element("type").Value, + CouterId = Convert.ToInt32(x.Element("counterId").Value) } ) .ToList(); diff --git a/Step.Database/Controllers/MaintenancesController.cs b/Step.Database/Controllers/MaintenancesController.cs index 206f8227..43cc81e4 100644 --- a/Step.Database/Controllers/MaintenancesController.cs +++ b/Step.Database/Controllers/MaintenancesController.cs @@ -1,4 +1,5 @@ -using Step.Model.DatabaseModels; +using Step.Model.ConfigModels; +using Step.Model.DatabaseModels; using Step.Model.DTOModels; using System; using System.Collections.Generic; @@ -23,9 +24,25 @@ namespace Step.Database.Controllers dbCtx.Dispose(); } - public DTOExpiredMaintenanceModel GetExpiredMaintenance() + public List FindLastMaintenance() { - return new DTOExpiredMaintenanceModel(); + List lastMaintenances = new List(); + // Find last performed maintenance + lastMaintenances = (from maintenances in dbCtx.PerformedMaintenances + where maintenances.Date == (from m1 in dbCtx.PerformedMaintenances // Select max data of performed maintenance + where m1.MaintenanceId == maintenances.MaintenanceId + select m1.Date + ).Max() + select maintenances).ToList(); + + return lastMaintenances; + } + + public List FindAll() + { + return dbCtx + .Maintenances + .ToList(); } public void CheckDifferencesFromDbAndXml() @@ -39,12 +56,58 @@ namespace Step.Database.Controllers !MaintenancesConfig.Select(y => y.Id).Contains(x.MaintenanceId) ).ToList(); + // Delete database items + foreach (var item in toDeleteMaint) + dbCtx.Maintenances.Remove(item); + dbCtx.SaveChanges(); + // Find common data from List toUpdateMaint = dbMaintenances.Where(x => MaintenancesConfig.Select(y => y.Id).Contains(x.MaintenanceId) - ).ToList(); + ) + .ToList(); - + // Update rows + if (toUpdateMaint != null) + foreach (MaintenanceModel item in toUpdateMaint) + { + // find to update into db + var old = dbCtx.Maintenances.Where(x => x.MaintenanceId == item.MaintenanceId).FirstOrDefault(); + + // Update model + old = MaintenancesConfig.Where(x => x.Id == item.MaintenanceId).Select(x => + { + old.MaintenanceId = x.Id; + old.Deadline = x.Deadline; + old.Intervall = x.Intervall.TotalMinutes; + old.Type = x.Type; + old.CounterId = x.CouterId; + return old; + + }).FirstOrDefault(); + } + + dbCtx.SaveChanges(); + + // Get new maintenance from file + List toAddMaint = MaintenancesConfig + .Where(x => !toUpdateMaint.Select(y => y.MaintenanceId).Contains(x.Id)) + .Select(x => new MaintenanceModel() + { + MaintenanceId = x.Id, + Deadline = x.Deadline, + Intervall = x.Intervall.TotalMinutes, + Type = x.Type, + CounterId = x.CouterId + }) + .ToList(); + + // Add new maintenances to database + if (toAddMaint != null) + { + dbCtx.Maintenances.AddRange(toAddMaint); + dbCtx.SaveChanges(); + } } } } diff --git a/Step.Database/DatabaseContext.cs b/Step.Database/DatabaseContext.cs index 96272f0a..f5e170a2 100644 --- a/Step.Database/DatabaseContext.cs +++ b/Step.Database/DatabaseContext.cs @@ -24,6 +24,8 @@ namespace Step.Database public DbSet FunctionsAccess { get; set; } public DbSet Sessions { get; set; } public DbSet Maintenances { get; set; } + public DbSet PerformedMaintenances { get; set; } + public DatabaseContext() : base("mySQLDatabaseConnection") diff --git a/Step.Database/Migrations/201802141408206_InitCreate.Designer.cs b/Step.Database/Migrations/201802141408206_InitCreate.Designer.cs new file mode 100644 index 00000000..29ab1212 --- /dev/null +++ b/Step.Database/Migrations/201802141408206_InitCreate.Designer.cs @@ -0,0 +1,29 @@ +// +namespace Step.Database.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")] + public sealed partial class InitCreate : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(InitCreate)); + + string IMigrationMetadata.Id + { + get { return "201802141408206_InitCreate"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Step.Database/Migrations/201802141408206_InitCreate.cs b/Step.Database/Migrations/201802141408206_InitCreate.cs new file mode 100644 index 00000000..9f800792 --- /dev/null +++ b/Step.Database/Migrations/201802141408206_InitCreate.cs @@ -0,0 +1,136 @@ +namespace Step.Database.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class InitCreate : DbMigration + { + public override void Up() + { + CreateTable( + "dbo.function_access", + c => new + { + id = c.Int(nullable: false, identity: true), + name = c.String(unicode: false), + write_level_min = c.Int(nullable: false), + read_level_min = c.Int(nullable: false), + area = c.String(unicode: false), + enabled = c.Boolean(nullable: false), + plc_id = c.Int(nullable: false), + }) + .PrimaryKey(t => t.id); + + CreateTable( + "dbo.machine", + c => new + { + id = c.Int(nullable: false, identity: true), + name = c.String(unicode: false), + unique_id = c.String(unicode: false), + }) + .PrimaryKey(t => t.id); + + CreateTable( + "dbo.machine_user", + c => new + { + id = c.Int(nullable: false, identity: true), + machine_id = c.Int(nullable: false), + user_id = c.Int(nullable: false), + role_id = c.Int(nullable: false), + }) + .PrimaryKey(t => t.id) + .ForeignKey("dbo.machine", t => t.machine_id, cascadeDelete: true) + .ForeignKey("dbo.role", t => t.role_id, cascadeDelete: true) + .ForeignKey("dbo.user", t => t.user_id, cascadeDelete: true) + .Index(t => new { t.machine_id, t.user_id }, unique: true, clustered: true, name: "unique_machine_user") + .Index(t => t.role_id); + + CreateTable( + "dbo.role", + c => new + { + id = c.Int(nullable: false, identity: true), + name = c.String(unicode: false), + level = c.Int(nullable: false), + }) + .PrimaryKey(t => t.id); + + CreateTable( + "dbo.user", + c => new + { + id = c.Int(nullable: false, identity: true), + username = c.String(nullable: false, unicode: false), + first_name = c.String(unicode: false), + last_name = c.String(unicode: false), + password = c.String(unicode: false), + security_stamp = c.String(unicode: false), + language = c.String(unicode: false), + role_id = c.Int(nullable: false), + }) + .PrimaryKey(t => t.id); + + CreateTable( + "dbo.maintenance", + c => new + { + id = c.Int(nullable: false), + intervall = c.Double(nullable: false), + deadline = c.DateTime(nullable: false, precision: 0), + type = c.String(unicode: false), + counter_id = c.Int(nullable: false), + creation_date = c.DateTime(nullable: false, precision: 0), + }) + .PrimaryKey(t => t.id); + + CreateTable( + "dbo.performed_maintenance", + c => new + { + id = c.Int(nullable: false, identity: true), + date = c.DateTime(nullable: false, precision: 0), + counter_value = c.Int(nullable: false), + maintenance = c.Int(nullable: false), + }) + .PrimaryKey(t => t.id) + .ForeignKey("dbo.maintenance", t => t.maintenance, cascadeDelete: true) + .Index(t => t.maintenance); + + CreateTable( + "dbo.session", + c => new + { + id = c.Int(nullable: false, identity: true), + token = c.String(unicode: false), + machine_user_id = c.Int(nullable: false), + }) + .PrimaryKey(t => t.id) + .ForeignKey("dbo.machine_user", t => t.machine_user_id, cascadeDelete: true) + .Index(t => t.machine_user_id); + + } + + public override void Down() + { + DropForeignKey("dbo.session", "machine_user_id", "dbo.machine_user"); + DropForeignKey("dbo.performed_maintenance", "maintenance", "dbo.maintenance"); + DropForeignKey("dbo.machine_user", "user_id", "dbo.user"); + DropForeignKey("dbo.machine_user", "role_id", "dbo.role"); + DropForeignKey("dbo.machine_user", "machine_id", "dbo.machine"); + DropIndex("dbo.session", new[] { "machine_user_id" }); + DropIndex("dbo.performed_maintenance", new[] { "maintenance" }); + DropIndex("dbo.machine_user", new[] { "role_id" }); + DropIndex("dbo.machine_user", "unique_machine_user"); + DropTable("dbo.session"); + DropTable("dbo.performed_maintenance"); + DropTable("dbo.maintenance"); + DropTable("dbo.user"); + DropTable("dbo.role"); + DropTable("dbo.machine_user"); + DropTable("dbo.machine"); + DropTable("dbo.function_access"); + } + } +} diff --git a/Step.Database/Migrations/201802141408206_InitCreate.resx b/Step.Database/Migrations/201802141408206_InitCreate.resx new file mode 100644 index 00000000..607d55ae --- /dev/null +++ b/Step.Database/Migrations/201802141408206_InitCreate.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Step.Database/Step.Database.csproj b/Step.Database/Step.Database.csproj index 12a45bb5..94de5c26 100644 --- a/Step.Database/Step.Database.csproj +++ b/Step.Database/Step.Database.csproj @@ -77,6 +77,10 @@ + + + 201802141408206_InitCreate.cs + @@ -110,5 +114,10 @@ + + + 201802141408206_InitCreate.cs + + \ No newline at end of file diff --git a/Step.Model/ConfigModels/MaintenanceConfigModel.cs b/Step.Model/ConfigModels/MaintenanceConfigModel.cs index 4f6e2b72..c2f06671 100644 --- a/Step.Model/ConfigModels/MaintenanceConfigModel.cs +++ b/Step.Model/ConfigModels/MaintenanceConfigModel.cs @@ -1,16 +1,15 @@ using System; using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Step.Model.ConfigModels { public class MaintenanceConfigModel { - public int Id; - public Dictionary LocalizedNames; - public int count; + public int Id { get; set; } + public Dictionary LocalizedNames { get; set; } + public TimeSpan Intervall { get; set; } + public DateTime Deadline { get; set; } + public string Type { get; set; } + public int CouterId { get; set; } } -} +} \ No newline at end of file diff --git a/Step.Model/DTOModels/DTOExpiredMaintenanceModel.cs b/Step.Model/DTOModels/DTOExpiredMaintenanceModel.cs index eb5f4c68..e644e15a 100644 --- a/Step.Model/DTOModels/DTOExpiredMaintenanceModel.cs +++ b/Step.Model/DTOModels/DTOExpiredMaintenanceModel.cs @@ -1,15 +1,10 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Step.Model.DTOModels { public class DTOExpiredMaintenanceModel { public string Id { get; set; } - public string Name { get; set; } - public string ExpirationDate { get; set; } + public DateTime ExpirationDate { get; set; } } -} +} \ No newline at end of file diff --git a/Step.Model/DatabaseModels/MaintenanceModel.cs b/Step.Model/DatabaseModels/MaintenanceModel.cs index 938a5e72..5c7a6545 100644 --- a/Step.Model/DatabaseModels/MaintenanceModel.cs +++ b/Step.Model/DatabaseModels/MaintenanceModel.cs @@ -8,14 +8,15 @@ namespace Step.Model.DatabaseModels public class MaintenanceModel { [Key] + [DatabaseGenerated(DatabaseGeneratedOption.None)] [Column("id")] public int MaintenanceId { get; set; } [Column("intervall")] - public TimeSpan Intervall { get; set; } + public double Intervall { get; set; } [Column("deadline")] - public DateTime DeadLine { get; set; } + public DateTime Deadline { get; set; } [Column("type")] public string Type { get; set; } @@ -26,17 +27,17 @@ namespace Step.Model.DatabaseModels [Column("creation_date")] public DateTime CreationDate { get; set; } - public override bool Equals(object obj) - { - var item = obj as MaintenanceModel; + //public override bool Equals(object obj) + //{ + // var item = obj as MaintenanceModel; - if (item == null) - return false; + // if (item == null) + // return false; - if (item.MaintenanceId != MaintenanceId) - return false; + // if (item.MaintenanceId != MaintenanceId) + // return false; - return true; - } + // return true; + //} } } \ No newline at end of file diff --git a/Step.Model/DatabaseModels/PerformedMaintenanceModel.cs b/Step.Model/DatabaseModels/PerformedMaintenanceModel.cs index cfb03446..f553e107 100644 --- a/Step.Model/DatabaseModels/PerformedMaintenanceModel.cs +++ b/Step.Model/DatabaseModels/PerformedMaintenanceModel.cs @@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Step.Model.DatabaseModels { - [Table("machine_user")] + [Table("performed_maintenance")] public class PerformedMaintenanceModel { [Key] @@ -16,5 +16,11 @@ namespace Step.Model.DatabaseModels [Column("counter_value")] public int CounterValue { get; set; } + + [Column("maintenance")] + public int MaintenanceId { get; set; } + + [ForeignKey("MaintenanceId")] + public MaintenanceModel Maintenance { get; set; } } } \ No newline at end of file diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index 68b9a0ef..4926b70d 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -4,6 +4,7 @@ using CMS_CORE.Fanuc; using CMS_CORE.Osai; using CMS_CORE.Siemens; using Step.Database.Controllers; +using Step.Model.DatabaseModels; using Step.Model.DTOModels; using System; using System.Collections.Generic; @@ -336,6 +337,65 @@ namespace Step.NC return cmsError; } + public CmsError GetExpiredMaintenances() + { + List expiredMaintenance = new List(); + + List counters = new List(); + + CmsError cmsError = numericalControl.PLC_RMachineCounters(ref counters); + if (cmsError.IsError()) + return cmsError; + + using (MaintenancesController maintenancesController = new MaintenancesController()) + { + // Get the last performed maintenance for each maintenance + List performedMaintenance = maintenancesController.FindLastMaintenance(); + + // Get all the active maintenances + List maintenances = maintenancesController.FindAll(); + + foreach (var maintenance in maintenances) + { + // Get matching last performed maintenance for current maintenance + var performed = performedMaintenance.Find(x => x.MaintenanceId == maintenance.MaintenanceId); + + switch (maintenance.Type) + { + case "interval": + { + // Get matching counter for the current maintenance + var counter = counters.Find(x => x.Id == maintenance.CounterId); + + // PLC - LASTPERFORMED >= MAINTENANCE_INTERVAL + if (counter.Value - performed.CounterValue >= maintenance.Intervall) + { + expiredMaintenance.Add(new DTOExpiredMaintenanceModel() + { + Id = MAINTENANCE_PREFIX_ID + maintenance.MaintenanceId, + ExpirationDate = DateTime.Now + }); + } + } + break; + + case "exp_date": + { + if (maintenance.Deadline <= DateTime.Now) + expiredMaintenance.Add(new DTOExpiredMaintenanceModel() + { + Id = MAINTENANCE_PREFIX_ID + maintenance.MaintenanceId, + ExpirationDate = maintenance.Deadline + }); + } + break; + } + } + } + + return cmsError; + } + public CmsError RefreshAllAlarms() { return new CmsError(0, ""); diff --git a/Step.Tasks/ThreadsFunctions.cs b/Step.Tasks/ThreadsFunctions.cs index 4cad1f8d..abaec1a7 100644 --- a/Step.Tasks/ThreadsFunctions.cs +++ b/Step.Tasks/ThreadsFunctions.cs @@ -281,6 +281,50 @@ public static class ThreadsFunctions } } + public static void ReadExpiredMaintenances() + { + NcHandler ncHandler = new NcHandler(); + Stopwatch sw = new Stopwatch(); + + try + { + // Try connection + CmsError libraryError = ncHandler.Connect(); + if (libraryError.errorCode != 0) + ManageLibraryError(libraryError); + + while (true) + { + sw.Restart(); + + if (ncHandler.numericalControl.NC_IsConnected()) + { + // Get Data from database and PLC + libraryError = ncHandler.GetExpiredMaintenances(); + if (libraryError.errorCode != 0) + ManageLibraryError(libraryError); + //else + // Send through signalR + // MessageServices.Current.Publish(SEND_FUNCTIONALITY_DATA, null, functionsAccessList); + } + else + TryNcConnection(); + + sw.Stop(); + //Send to the UI the time + ReadFunctionTimer += sw.ElapsedMilliseconds; + ReadFunctionTimes++; + + // Wait + Thread.Sleep(200); + } + } + catch (ThreadAbortException) + { + ncHandler.Dispose(); + } + } + #endregion Nc Threads #region SupportFunctions diff --git a/Step.Tasks/ThreadsHandler.cs b/Step.Tasks/ThreadsHandler.cs index 34990992..756739d1 100644 --- a/Step.Tasks/ThreadsHandler.cs +++ b/Step.Tasks/ThreadsHandler.cs @@ -1,25 +1,14 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading; -using System.Threading.Tasks; -using CMS_CORE; -using CMS_CORE.Demo; -using CMS_CORE.Fanuc; -using CMS_CORE.Osai; -using CMS_CORE.Siemens; -using Step.NC; -using static Step.Config.ServerConfig; -using static Step.Utils.Constants; using TeamDev.SDK.MVVM; -using System.Diagnostics; +using static Step.Utils.Constants; namespace Step.Core { - public static class ThreadsHandler - { - private static List ThreadFunctionsList = new List + public static class ThreadsHandler + { + private static List ThreadFunctionsList = new List { ThreadsFunctions.ReadAlarms, ThreadsFunctions.ReadNcGenericInfo, @@ -27,71 +16,68 @@ namespace Step.Core ThreadsFunctions.ReadPowerOnData, ThreadsFunctions.StatThread, ThreadsFunctions.ReadProcessesPPStatus, - ThreadsFunctions.ReadEnabledFunctionality + ThreadsFunctions.ReadEnabledFunctionality, + ThreadsFunctions.ReadExpiredMaintenances }; - private volatile static List RunningThreadsList = new List(); - internal volatile static Dictionary RunningThreadStatus = new Dictionary(); - public static void Start() - { - ThreadsFunctions.TryNcConnection(); - } + private volatile static List RunningThreadsList = new List(); + internal volatile static Dictionary RunningThreadStatus = new Dictionary(); - public static void StartWorkers() - { - - RunningThreadStatus.Clear(); - - // For each function run in the list a thread - ThreadFunctionsList.ForEach(threadFunction => - { - // Run new Thread in the list - Thread t = new Thread(() => - threadFunction() - ); - t.Start(); - // Add thread to running threads list - lock (RunningThreadsList) - RunningThreadsList.Add(t); - - - RunningThreadStatus.Add(threadFunction.Method.Name, "---"); - }); - - MessageServices.Current.Publish(SEND_THREADS_STATUS, null, RunningThreadStatus); - } - - public static void Stop() - { - - // Stop each thread - lock (RunningThreadsList) - RunningThreadsList.ForEach(thread => - { - thread.Abort(); - }); - - // Remove threads from running status - lock (RunningThreadsList) - RunningThreadsList.Clear(); - - RunningThreadStatus.Clear(); - RunningThreadStatus.Add("TryNcConnection", "---"); - MessageServices.Current.Publish(SEND_THREADS_STATUS, null, RunningThreadStatus); - } - - public static void Close() - { - //Abort Nc Read Threads - RunningThreadsList.ForEach(thread => + public static void Start() { - thread.Abort(); - }); + ThreadsFunctions.TryNcConnection(); + } - //Abort Connect Thread - ThreadsFunctions.AbortNcConnection(); + public static void StartWorkers() + { + RunningThreadStatus.Clear(); + + // For each function run in the list a thread + ThreadFunctionsList.ForEach(threadFunction => + { + // Run new Thread in the list + Thread t = new Thread(() => + threadFunction() + ); + t.Start(); + // Add thread to running threads list + lock (RunningThreadsList) + RunningThreadsList.Add(t); + + RunningThreadStatus.Add(threadFunction.Method.Name, "---"); + }); + + MessageServices.Current.Publish(SEND_THREADS_STATUS, null, RunningThreadStatus); + } + + public static void Stop() + { + // Stop each thread + lock (RunningThreadsList) + RunningThreadsList.ForEach(thread => + { + thread.Abort(); + }); + + // Remove threads from running status + lock (RunningThreadsList) + RunningThreadsList.Clear(); + + RunningThreadStatus.Clear(); + RunningThreadStatus.Add("TryNcConnection", "---"); + MessageServices.Current.Publish(SEND_THREADS_STATUS, null, RunningThreadStatus); + } + + public static void Close() + { + //Abort Nc Read Threads + RunningThreadsList.ForEach(thread => + { + thread.Abort(); + }); + + //Abort Connect Thread + ThreadsFunctions.AbortNcConnection(); + } } - - } -} - +} \ No newline at end of file diff --git a/Step.Utils/Constants.cs b/Step.Utils/Constants.cs index 7e2ea65b..1df2fcde 100644 --- a/Step.Utils/Constants.cs +++ b/Step.Utils/Constants.cs @@ -84,5 +84,8 @@ namespace Step.Utils public const string SEND_PROCESSES_DATA = "SEND_PROCESSES_STATUS"; public const string SEND_FUNCTIONALITY_DATA = "SEND_FUNCTION_DATA"; + + // ID prefix + public const string MAINTENANCE_PREFIX_ID = "MAINT_"; } } diff --git a/Step/Controllers/WebApi/LanguageController.cs b/Step/Controllers/WebApi/LanguageController.cs index cfc24622..d3814a60 100644 --- a/Step/Controllers/WebApi/LanguageController.cs +++ b/Step/Controllers/WebApi/LanguageController.cs @@ -8,6 +8,7 @@ using Step.Model.ConfigModels; using Step.Model.DTOModels; using static Step.Config.ServerConfig; using static Step.Utils.LanguageController; +using static Step.Utils.Constants; namespace Step.Controllers.WebApi { @@ -54,7 +55,7 @@ namespace Step.Controllers.WebApi return MaintenancesConfig .ToDictionary( - x => "MANT_" + x.Id.ToString(), + x => MAINTENANCE_PREFIX_ID + x.Id.ToString(), x => GetValueFromMaintenanceNameList(x.LocalizedNames, language, x.Id) ); }