diff --git a/Step.Database/Controllers/MaintenancesController.cs b/Step.Database/Controllers/MaintenancesController.cs index d3604d70..bc409de8 100644 --- a/Step.Database/Controllers/MaintenancesController.cs +++ b/Step.Database/Controllers/MaintenancesController.cs @@ -1,4 +1,5 @@ using Step.Model.DatabaseModels; +using Step.Model.DTOModels; using Step.Model.DTOModels.MaintenanceModels; using System; using System.Collections.Generic; @@ -95,6 +96,18 @@ namespace Step.Database.Controllers return dbMaint; } + public void Delete(int maintId) + { + MaintenanceModel maint = FindById(maintId); + Delete(maint); + } + + public void Delete(MaintenanceModel maint) + { + dbCtx.Maintenances.Remove(maint); + dbCtx.SaveChanges(); + } + public void CheckDifferencesFromDbAndXml() { List dbMaintenances = dbCtx @@ -176,5 +189,70 @@ namespace Step.Database.Controllers dbCtx.SaveChanges(); } } + + #region Notes + + public MaintenanceNoteModel FindNoteById(int noteId) + { + return dbCtx + .MaintenancesNotes + .Find(noteId); + } + + public List FindNotes() + { + return dbCtx + .MaintenancesNotes + .ToList(); + } + + public List GetNotesByMaintId(int maintenanceId) + { + return dbCtx + .MaintenancesNotes + .Where(x => x.MaintenanceId == maintenanceId) // Filter by id + .Select(x => new DTOMaintenanceNoteModel() // Convert to return model + { + Id = x.Id, + DateTime = x.DateTime, + Message = x.Message, + User = new DTOMessageUserModel() + { + Id = x.User.UserId, + FirstName = x.User.FirstName, + LastName = x.User.LastName, + Username = x.User.Username + } + }) + .ToList(); + } + + public DTOMaintenanceNoteModel CreateNote(int userId, int maintenanceId, DTONewMaintenanceNoteModel newNote) + { + // Create model + MaintenanceNoteModel note = new MaintenanceNoteModel() + { + Message = newNote.Message, + DateTime = DateTime.Now, + MaintenanceId = maintenanceId, + UserId = userId + }; + // Add & save into database + dbCtx.MaintenancesNotes.Add(note); + + dbCtx.SaveChanges(); + + return (DTOMaintenanceNoteModel)note; + } + + public void DeleteMessage(int noteId) + { + MaintenanceNoteModel note = FindNoteById(noteId); + dbCtx.MaintenancesNotes.Remove(note); + + dbCtx.SaveChanges(); + } + + #endregion } } \ No newline at end of file diff --git a/Step.Database/DatabaseContext.cs b/Step.Database/DatabaseContext.cs index ebe2168c..52129988 100644 --- a/Step.Database/DatabaseContext.cs +++ b/Step.Database/DatabaseContext.cs @@ -25,6 +25,7 @@ namespace Step.Database public DbSet Sessions { get; set; } public DbSet Maintenances { get; set; } public DbSet PerformedMaintenances { get; set; } + public DbSet MaintenancesNotes { get; set; } // Create migration string public static string CONNECTION_STRING = "Server = " + "localhost" + "; Database=" + DATABASE_NAME +";Uid="+ DATABASE_USER +";Pwd="+ DATABASE_PWD +";"; diff --git a/Step.Database/Migrations/201806120921204_InitMigration.Designer.cs b/Step.Database/Migrations/201806130949510_InitMigration.Designer.cs similarity index 92% rename from Step.Database/Migrations/201806120921204_InitMigration.Designer.cs rename to Step.Database/Migrations/201806130949510_InitMigration.Designer.cs index bcb21d1f..b4f68a74 100644 --- a/Step.Database/Migrations/201806120921204_InitMigration.Designer.cs +++ b/Step.Database/Migrations/201806130949510_InitMigration.Designer.cs @@ -13,7 +13,7 @@ namespace Step.Database.Migrations string IMigrationMetadata.Id { - get { return "201806120921204_InitMigration"; } + get { return "201806130949510_InitMigration"; } } string IMigrationMetadata.Source diff --git a/Step.Database/Migrations/201806120921204_InitMigration.cs b/Step.Database/Migrations/201806130949510_InitMigration.cs similarity index 85% rename from Step.Database/Migrations/201806120921204_InitMigration.cs rename to Step.Database/Migrations/201806130949510_InitMigration.cs index 61f85ae9..e080af97 100644 --- a/Step.Database/Migrations/201806120921204_InitMigration.cs +++ b/Step.Database/Migrations/201806130949510_InitMigration.cs @@ -68,7 +68,6 @@ namespace Step.Database.Migrations 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); @@ -92,6 +91,22 @@ namespace Step.Database.Migrations .ForeignKey("dbo.user", t => t.user_id) .Index(t => t.user_id); + CreateTable( + "dbo.maintenance_note", + c => new + { + id = c.Int(nullable: false, identity: true), + message = c.String(unicode: false), + maintenance_id = c.Int(), + user_id = c.Int(), + timestamp = c.DateTime(nullable: false, precision: 0), + }) + .PrimaryKey(t => t.id) + .ForeignKey("dbo.maintenance", t => t.maintenance_id) + .ForeignKey("dbo.user", t => t.user_id) + .Index(t => t.maintenance_id) + .Index(t => t.user_id); + CreateTable( "dbo.performed_maintenance", c => new @@ -123,17 +138,22 @@ namespace Step.Database.Migrations { DropForeignKey("dbo.session", "machine_user_id", "dbo.machine_user"); DropForeignKey("dbo.performed_maintenance", "maintenance", "dbo.maintenance"); + DropForeignKey("dbo.maintenance_note", "user_id", "dbo.user"); + DropForeignKey("dbo.maintenance_note", "maintenance_id", "dbo.maintenance"); DropForeignKey("dbo.maintenance", "user_id", "dbo.user"); 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.maintenance_note", new[] { "user_id" }); + DropIndex("dbo.maintenance_note", new[] { "maintenance_id" }); DropIndex("dbo.maintenance", new[] { "user_id" }); DropIndex("dbo.machine_user", new[] { "role_id" }); DropIndex("dbo.machine_user", "unique_machine_user"); DropTable("dbo.session"); DropTable("dbo.performed_maintenance"); + DropTable("dbo.maintenance_note"); DropTable("dbo.maintenance"); DropTable("dbo.user"); DropTable("dbo.role"); diff --git a/Step.Database/Migrations/201806120921204_InitMigration.resx b/Step.Database/Migrations/201806130949510_InitMigration.resx similarity index 53% rename from Step.Database/Migrations/201806120921204_InitMigration.resx rename to Step.Database/Migrations/201806130949510_InitMigration.resx index 81fbbc51..b4e7b9c7 100644 --- a/Step.Database/Migrations/201806120921204_InitMigration.resx +++ b/Step.Database/Migrations/201806130949510_InitMigration.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo diff --git a/Step.Database/Step.Database.csproj b/Step.Database/Step.Database.csproj index 635e6ee4..452d795f 100644 --- a/Step.Database/Step.Database.csproj +++ b/Step.Database/Step.Database.csproj @@ -77,9 +77,9 @@ - - - 201806120921204_InitMigration.cs + + + 201806130949510_InitMigration.cs @@ -115,8 +115,8 @@ - - 201806120921204_InitMigration.cs + + 201806130949510_InitMigration.cs diff --git a/Step.Model/DTOModels/DTOUserModel.cs b/Step.Model/DTOModels/DTOUserModel.cs index ed06ee87..054c1eb1 100644 --- a/Step.Model/DTOModels/DTOUserModel.cs +++ b/Step.Model/DTOModels/DTOUserModel.cs @@ -1,4 +1,5 @@ -using System; +using Step.Model.DatabaseModels; +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; @@ -7,12 +8,28 @@ using System.Threading.Tasks; namespace Step.Model.DTOModels { - public class DTOUserModel + public class DTOMessageUserModel { public int Id { get; set; } public string Username { get; set; } public string FirstName { get; set; } public string LastName { get; set; } + + public static explicit operator DTOMessageUserModel(UserModel user) + { + return new DTOUserModel() + { + Id = user.UserId, + FirstName = user.FirstName, + LastName = user.LastName, + Language = user.Language, + Username = user.Username + }; + } + } + + public class DTOUserModel : DTOMessageUserModel + { public CultureInfo Language { get; set; } public DTORoleModel Role { get; set; } } diff --git a/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceModel.cs b/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceModel.cs index 72cfbeed..9a019571 100644 --- a/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceModel.cs +++ b/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceModel.cs @@ -28,6 +28,9 @@ namespace Step.Model.DTOModels.MaintenanceModels public TimeSpan MissingDays { get; set; } + public uint PlcCounter { get; set; } + public bool CreatedByCms { get; set; } + public bool CanEdit { get; set; } } } \ No newline at end of file diff --git a/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceNoteModel.cs b/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceNoteModel.cs new file mode 100644 index 00000000..b3d04154 --- /dev/null +++ b/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceNoteModel.cs @@ -0,0 +1,36 @@ +using Step.Model.DatabaseModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Step.Model.DTOModels.MaintenanceModels +{ + public class DTONewMaintenanceNoteModel + { + public string Message { get; set; } + } + + public class DTOMaintenanceNoteModel : DTONewMaintenanceNoteModel + { + public int Id { get; set; } + + public DateTime DateTime { get; set; } + + public DTOMessageUserModel User { get; set; } + + + public static explicit operator DTOMaintenanceNoteModel(MaintenanceNoteModel note) + { + DTOMessageUserModel user = note.User != null ? (DTOMessageUserModel)note.User : null; + return new DTOMaintenanceNoteModel() + { + Id = note.Id, + DateTime = note.DateTime, + Message = note.Message, + User = user + }; + } + } +} diff --git a/Step.Model/DatabaseModels/MaintenanceNoteModel.cs b/Step.Model/DatabaseModels/MaintenanceNoteModel.cs new file mode 100644 index 00000000..f1ddf8af --- /dev/null +++ b/Step.Model/DatabaseModels/MaintenanceNoteModel.cs @@ -0,0 +1,37 @@ +using Step.Model.DatabaseModels; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Step.Model.DatabaseModels +{ + [Table("maintenance_note")] + public class MaintenanceNoteModel + { + [Key] + [Column("id")] + public int Id { get; set; } + + [Column("message")] + public string Message { get; set; } + + [Column("maintenance_id")] + public int? MaintenanceId { get; set; } + + [ForeignKey("MaintenanceId")] + public MaintenanceModel Maintenance { get; set; } + + [Column("user_id")] + public int? UserId { get; set; } + + [ForeignKey("UserId")] + public UserModel User { get; set; } + + [Column("timestamp")] + public DateTime DateTime { get; set; } + } +} diff --git a/Step.Model/DatabaseModels/UserModel.cs b/Step.Model/DatabaseModels/UserModel.cs index dbd8f7dc..8a478898 100644 --- a/Step.Model/DatabaseModels/UserModel.cs +++ b/Step.Model/DatabaseModels/UserModel.cs @@ -45,8 +45,5 @@ namespace Step.Model.DatabaseModels _language = value.TwoLetterISOLanguageName; } } - - [Column("role_id")] - public int RoleId { get; set; } } } \ No newline at end of file diff --git a/Step.Model/Step.Model.csproj b/Step.Model/Step.Model.csproj index 79553062..acd0db73 100644 --- a/Step.Model/Step.Model.csproj +++ b/Step.Model/Step.Model.csproj @@ -101,7 +101,9 @@ + + diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index 65d47648..5aa081b6 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -383,18 +383,20 @@ namespace Step.NC List maintenances = maintenancesController.FindAll(); // TODO db or config file? double percentage = 0; + TimeSpan missingDays = new TimeSpan(); + CounterModel counter = new CounterModel(); foreach (var currMaintenance in maintenances) { // Get matching last performed maintenance for current maintenance var performed = performedMaintenances.Find(x => x.MaintenanceId == currMaintenance.MaintenanceId); - TimeSpan missingDays = new TimeSpan(); + switch (currMaintenance.Type) { case MAINTENANCE_TYPE.MACHINE_INTERVAL: { // Get matching counter for the current maintenance - var counter = counters.Find(x => x.Id == currMaintenance.CounterId); + counter = counters.Find(x => x.Id == currMaintenance.CounterId); int perfVal = 0; if (performed != null) @@ -413,6 +415,7 @@ namespace Step.NC { percentage = ((DateTime.Now - currMaintenance.CreationDate).TotalMinutes * 100) / (currMaintenance.Deadline - currMaintenance.CreationDate).TotalMinutes; // TimeSpan.FromTicks((currMaintenance.Deadline.Ticks)).TotalMinutes missingDays = currMaintenance.Deadline - DateTime.Now; + counter = new CounterModel(); } } break; @@ -430,7 +433,8 @@ namespace Step.NC // percentage = Passed minutes since last maintenance * 100 / Interval percentage = (minutesPassedFromLastMaint * 100) / SupportFunctions.ConvertInMinutes(currMaintenance.Interval.Value, currMaintenance.UnitOfMeasure.Value); - missingDays = TimeSpan.FromMinutes(minutesPassedFromLastMaint - SupportFunctions.ConvertInMinutes(currMaintenance.Interval.Value, currMaintenance.UnitOfMeasure.Value)); + missingDays = TimeSpan.FromMinutes( -1 * (minutesPassedFromLastMaint - SupportFunctions.ConvertInMinutes(currMaintenance.Interval.Value, currMaintenance.UnitOfMeasure.Value))); + counter = new CounterModel(); } break; } @@ -446,9 +450,11 @@ namespace Step.NC LastExpirationDate = currMaintenance.LastExpirationDate, Type = currMaintenance.Type.ToString(), UnitOfMeasure = currMaintenance.UnitOfMeasure.ToString(), - PercentageOfCompletion = percentage >= 0 ? Convert.ToInt32(percentage) : 100, + PercentageOfCompletion = percentage >= 0 && percentage < 100 ? Convert.ToInt32(percentage) : 100, MissingDays = missingDays, - CreatedByCms = currMaintenance.UserId == null + PlcCounter = counter.Value, + CreatedByCms = currMaintenance.UserId == null, + CanEdit = true }); } } diff --git a/Step/Controllers/WebApi/MaintenanceController.cs b/Step/Controllers/WebApi/MaintenanceController.cs index 93497fd4..cc13183e 100644 --- a/Step/Controllers/WebApi/MaintenanceController.cs +++ b/Step/Controllers/WebApi/MaintenanceController.cs @@ -77,16 +77,17 @@ namespace Step.Controllers.WebApi using (MaintenancesController maintenancesController = new MaintenancesController()) { - // Check if user can update + // Find maintenance MaintenanceModel dbMaint = maintenancesController.FindById(maintenanceId); if (dbMaint == null) return NotFound(); + // Check if is created by CMS if (dbMaint.UserId == null) return Unauthorized(); using (MachinesUsersController machineUsersController = new MachinesUsersController()) { - // Check if user can edit the maintenance + // Check if user can edit the maintenance -> caller id - maintenance user id int comparision = machineUsersController.CompareUsersRole(Convert.ToInt32(userId.Value), dbMaint.UserId.Value, MachineConfig.MachineId); if (comparision < 0) return Unauthorized(); @@ -105,5 +106,95 @@ namespace Step.Controllers.WebApi } } } + + + [Route("maintenance/{maintenanceId:int}"), HttpDelete] + + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.USER_FUNCTIONS, Action = ACTIONS.WRITE)] + public IHttpActionResult DeleteMaintenance(int maintenanceId) + { + if (!ModelState.IsValid) + return BadRequest(ModelState); + + var identity = User.Identity as ClaimsIdentity; + // Find user id from the bearer token + var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).FirstOrDefault(); + if (userId == null) + return Unauthorized(); + + using (MaintenancesController maintenancesController = new MaintenancesController()) + { + // Check if maintenance id + MaintenanceModel dbMaint = maintenancesController.FindById(maintenanceId); + if (dbMaint == null) + return NotFound(); + if (dbMaint.UserId == null) + return Unauthorized(); + + using (MachinesUsersController machineUsersController = new MachinesUsersController()) + { + // Check if user can delete the maintenance -> caller id - maintenance user id + int comparision = machineUsersController.CompareUsersRole(Convert.ToInt32(userId.Value), dbMaint.UserId.Value, MachineConfig.MachineId); + if (comparision < 0) + return Unauthorized(); + } + + // Update data + maintenancesController.Delete(dbMaint); + + return Ok(); + } + } + + [Route("maintenance/{maintenanceId:int}/note"), HttpGet] + + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.USER_FUNCTIONS, Action = ACTIONS.WRITE)] + public IHttpActionResult GetMaintenanceNotes(int maintenanceId) + { + if (!ModelState.IsValid) + return BadRequest(ModelState); + + using (MaintenancesController maintenancesController = new MaintenancesController()) + { + // Check if maintenance id + MaintenanceModel dbMaint = maintenancesController.FindById(maintenanceId); + if (dbMaint == null) + return NotFound(); + + // Update data + List notes = maintenancesController.GetNotesByMaintId(maintenanceId); + + return Ok(notes); + } + } + + [Route("maintenance/{maintenanceId:int}/note"), HttpPost] + + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.USER_FUNCTIONS, Action = ACTIONS.WRITE)] + public IHttpActionResult AddMaintenanceNote(int maintenanceId, DTONewMaintenanceNoteModel note) + { + if (!ModelState.IsValid) + return BadRequest(ModelState); + + + var identity = User.Identity as ClaimsIdentity; + // Find user id from the bearer token + var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).FirstOrDefault(); + if (userId == null) + return Unauthorized(); + + using (MaintenancesController maintenancesController = new MaintenancesController()) + { + // Check if maintenance id + MaintenanceModel dbMaint = maintenancesController.FindById(maintenanceId); + if (dbMaint == null) + return NotFound(); + + // Update data + DTOMaintenanceNoteModel notes = maintenancesController.CreateNote(Convert.ToInt32(userId.Value), maintenanceId, note); + + return Ok(notes); + } + } } } \ No newline at end of file