From dc1093ae115eb31dc44bb6d21e8dafef4be706b6 Mon Sep 17 00:00:00 2001 From: Lucio Maranta Date: Tue, 11 Sep 2018 11:06:54 +0200 Subject: [PATCH] Fix queue manager Added move items Added client upload --- Client.Utils/Constants.cs | 1 + Client/Browser_Tools/BrowserJSObject.cs | 75 ++++++++++++++++++++ Libs/CMS_CORE_Library.dll | Bin 9082368 -> 9082368 bytes Step.NC/NcHandler.cs | 50 ++++++++++--- Step/Controllers/WebApi/NcFileController.cs | 47 ++++++++---- 5 files changed, 150 insertions(+), 23 deletions(-) diff --git a/Client.Utils/Constants.cs b/Client.Utils/Constants.cs index 21cd2b19..d32a31d7 100644 --- a/Client.Utils/Constants.cs +++ b/Client.Utils/Constants.cs @@ -72,6 +72,7 @@ namespace Client.Utils public const string StartingPage = "index.html"; public const string Uploadpage = "/api/file_manager/upload"; + public const string UPLOAD_ADD_QUEUE = "/api/file_manager/queue/add"; public const string ConfigPage = "api/configuration/client"; public const string errorPageUrl = @"error://error/"; diff --git a/Client/Browser_Tools/BrowserJSObject.cs b/Client/Browser_Tools/BrowserJSObject.cs index d8c1e139..bbc60955 100644 --- a/Client/Browser_Tools/BrowserJSObject.cs +++ b/Client/Browser_Tools/BrowserJSObject.cs @@ -61,6 +61,7 @@ namespace CMS_Client.Browser_Tools AddFunction("getProgramInfo").Execute += getProgramInfo; AddFunction("uploadAndActivateProgram").Execute += uploadAndActivateProgram; + AddFunction("uploadAndAddToQueue").Execute += uploadAndAddToQueue; } @@ -431,6 +432,80 @@ namespace CMS_Client.Browser_Tools } + //Upload and add to queue + public async void uploadAndAddToQueue(object sender, CfrV8HandlerExecuteEventArgs e) + { + string fileToUpload = ""; + Byte[] filecontent = null, imagecontent = null; + string fileNameNoExt; + string imageName = ""; + string fileName; + string imageDirectory; + int reps = 0; + + //Check the arguments numbers + if (e.Arguments.Length < 1 || e.Arguments[0] == null) + { + e.SetReturnValue(Constants.UPLOAD_ADD_QUEUE + "INVALID_ARGUMENTS"); + return; + } + + //Check if the file exists + fileToUpload = e.Arguments[0].StringValue; + reps = e.Arguments[1].IntValue; + + if (!System.IO.File.Exists(fileToUpload)) + { + e.SetReturnValue(Constants.UPLOAD_ADD_QUEUE + ";FILE_NOT_FOUND"); + return; + } + + //Get names and content of the file + fileNameNoExt = Path.GetFileNameWithoutExtension(fileToUpload); + fileName = Path.GetFileName(fileToUpload); ; + filecontent = System.IO.File.ReadAllBytes(fileToUpload); + + //Get all bytes of the image (if exists) + imageDirectory = Path.GetDirectoryName(fileToUpload); + foreach (string ext in _validImages) + { + if (System.IO.File.Exists(imageDirectory + "/" + fileNameNoExt + ext)) + { + imageName = fileNameNoExt + ext; + imagecontent = System.IO.File.ReadAllBytes(imageDirectory + "/" + fileNameNoExt + ext); + break; + } + } + + //Send all to the server + using (HttpClient httpClient = new HttpClient()) + { + //Create the new FORM + MultipartFormDataContent form = new MultipartFormDataContent(); + + //Add the content to the form + form.Add(new ByteArrayContent(filecontent), "file", fileName); + if (imagecontent != null) + form.Add(new ByteArrayContent(imagecontent), "image", imageName); + + form.Add(new StringContent(reps.ToString()), "reps"); + + //Send them + HttpResponseMessage response = httpClient + .PostAsync("http://" + Config.ConnectionConfig.ServerUrl + ":" + Config.ConnectionConfig.ServerPort + "/" + Constants.UPLOAD_ADD_QUEUE, + form) + .Result; + //Wait the answer + if (response.StatusCode == System.Net.HttpStatusCode.BadRequest) + e.SetReturnValue(Constants.UPLOAD_ADD_QUEUE + ";" + await response.Content.ReadAsStringAsync()); + else if (response.StatusCode != System.Net.HttpStatusCode.OK) + e.SetReturnValue(Constants.UPLOAD_ADD_QUEUE + ";" + response.ReasonPhrase); + else + e.SetReturnValue(""); + } + + } + //Read info of a file public void getProgramInfo(object sender, CfrV8HandlerExecuteEventArgs e) diff --git a/Libs/CMS_CORE_Library.dll b/Libs/CMS_CORE_Library.dll index 85d8be42171f582691feced9d42f1ed192c8ae2c..74ac503e6a788a2ec977b5422fab69750bf32cdf 100644 GIT binary patch delta 54123 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 rYL$6wwg1JK|5r?VsjN>#dh= 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 - tmpQueue.Id = SupportFunctions.GetNextId(PartProgramQueue[selectedProcess].Select(x => x.Id)); + queueItem.Id = SupportFunctions.GetNextId(PartProgramQueue[selectedProcess].Select(x => x.Id)); // Add new process to - PartProgramQueue[selectedProcess].Add(tmpQueue); + PartProgramQueue[selectedProcess].Add(queueItem); return cmsError; } @@ -298,8 +300,38 @@ namespace Step.NC return NO_ERROR; } - public CmsError EditQueueItemReps(int processId, int itemIndex, int reps) + public CmsError MoveQueueItems(int processId, int oldIndex, int newIndex, out List queue) { + oldIndex = oldIndex - 1; + newIndex = newIndex - 1; + + queue = new List(); + + // Check if there is a queue + if (!PartProgramQueue.ContainsKey(processId)) + return INCORRECT_PARAMETERS_ERROR; + // Check if items exists + if (PartProgramQueue[processId].ElementAtOrDefault(oldIndex) == null) + return INCORRECT_PARAMETERS_ERROR; + + var item = PartProgramQueue[processId][oldIndex]; + // Remove item in the old positions + PartProgramQueue[processId].RemoveAt(oldIndex); + // Add in the new position + PartProgramQueue[processId].Insert(newIndex, item); + + // Insert new ids + for (int i = 0; i < PartProgramQueue[processId].Count(); i++) + PartProgramQueue[processId][i].Id = i + 1; + + queue = PartProgramQueue[processId]; + + return NO_ERROR; + } + + public CmsError EditQueueItemReps(int processId, int itemIndex, int reps, out DTOQueueModel model) + { + model = new DTOQueueModel(); itemIndex = itemIndex - 1; // Check if there is a queue if (!PartProgramQueue.ContainsKey(processId)) @@ -314,6 +346,8 @@ namespace Step.NC PartProgramQueue[processId][itemIndex].Reps = reps; PartProgramQueue[processId][itemIndex].RemainingReps = reps; + model = PartProgramQueue[processId][itemIndex]; + return NO_ERROR; } diff --git a/Step/Controllers/WebApi/NcFileController.cs b/Step/Controllers/WebApi/NcFileController.cs index 9a855aa3..a6f42699 100644 --- a/Step/Controllers/WebApi/NcFileController.cs +++ b/Step/Controllers/WebApi/NcFileController.cs @@ -170,7 +170,7 @@ namespace Step.Controllers.WebApi } List formItems = await MultipartHandler.ManageMultiPartFileAsync(Request); - + DTOQueueModel queueItem = new DTOQueueModel(); foreach (FormItem item in formItems) { if (item.IsAFile) @@ -189,7 +189,7 @@ namespace Step.Controllers.WebApi if (repsParam == null || !Int32.TryParse(repsParam.Value, out int reps)) return BadRequest(); - CmsError cmsError = ncHandler.UploadPartProgramAddToQueue(TEMP_FILE, item.FileName, reps, out ActiveProgramDataModel programData); + CmsError cmsError = ncHandler.UploadPartProgramAddToQueue(TEMP_FILE, item.FileName, reps, out queueItem); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } @@ -201,7 +201,7 @@ namespace Step.Controllers.WebApi } } - return Ok(); + return Ok(queueItem); } [Route("queue/{processId:int}/remove/{itemId:int}"), HttpDelete] @@ -219,38 +219,55 @@ namespace Step.Controllers.WebApi return Ok(); } - [Route("queue/{processId:int}/swap"), HttpPut] - public IHttpActionResult SwapQueueItems(int processId, SwapItems itemsPositions) + [Route("queue/{processId:int}/move"), HttpPut] + public IHttpActionResult MoveQueueItems(int processId, MoveItems itemsPositions) { using (NcHandler ncHandler = new NcHandler()) { - CmsError cmsError = ncHandler.SwapQueueItems(processId, itemsPositions.Item1Position, itemsPositions.Item2Position); + CmsError cmsError = ncHandler.MoveQueueItems(processId, itemsPositions.OldPosition, itemsPositions.NewPosition, out List queue); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); - } + - return Ok(); + return Ok(queue); + } } [Route("queue/{processId:int}/edit/{positionId:int}"), HttpPut] - public IHttpActionResult EditQueueItem(int processId, int positionId, SwapItems reps) + public IHttpActionResult EditQueueItem(int processId, int positionId, RepsModel reps) { using (NcHandler ncHandler = new NcHandler()) { - CmsError cmsError = ncHandler.EditQueueItemReps(processId, positionId, reps.Reps ); + CmsError cmsError = ncHandler.EditQueueItemReps(processId, positionId, reps.Reps, out DTOQueueModel queueItem); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); + + return Ok(queueItem); } - - return Ok(); } - public class SwapItems + [Route("queue/{processId:int}/empty"), HttpPut] + public IHttpActionResult EmptyQueue(int processId) { - public int Item1Position; + using (NcHandler ncHandler = new NcHandler()) + { + CmsError cmsError = ncHandler.EmptyQueue(processId); + if (cmsError.IsError()) + return BadRequest(cmsError.localizationKey); - public int Item2Position; + return Ok(); + } + } + public class MoveItems + { + public int OldPosition; + + public int NewPosition; + } + + public class RepsModel + { public int Reps; }