using Step.Database.Controllers; using Step.Model.DatabaseModels; using Step.Model.DTOModels.ToolModels; using Step.NC; using Step.Utils; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web.Http; using static CMS_CORE_Library.DataStructures; using static Step.Config.ServerConfig; using static Step.Model.Constants; namespace Step.Controllers.WebApi { [RoutePrefix("api/tool_manager/nc")] public class NcToolManagerApiController : ApiController { #region Tools [Route("tools"), HttpGet] public IHttpActionResult GetNcToolTable() { using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); CmsError cmsError = ncHandler.GetToolsData(out List tools); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); // If option is active, add family data to tools using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Get families List families = toolsManager.GetFamilies(); List toolsWithFamilies = new List(); // Create tool&family return objecs foreach (var tool in tools) { toolsWithFamilies.Add ( CreateToolAndFamilyObj( // Create return model with family data & tool data tool, families.Where(x => x.Id == tool.FamilyId).FirstOrDefault() // Find matching family ) ); } return Ok(toolsWithFamilies); } } } [Route("tool"), HttpPost] public IHttpActionResult AddTool([FromBody][Required]DTONewNcToolWithFamilyModel dtoToolWithFamily) { if (!ModelState.IsValid) return BadRequest(ModelState); using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if option is active if (ToolManagerConfig.FamilyOpt) { if (dtoToolWithFamily.FamilyId == 0) { // If param equal to 0 create a new family DTONewNcFamilyModel newFamily = new DTONewNcFamilyModel() { Name = "NewFamily" }; // Add new family & update family id DbNcFamilyModel newFam = toolsManager.AddFamily(newFamily); dtoToolWithFamily.FamilyId = newFam.FamilyId; } else { // Check if family exists DbNcFamilyModel fam = toolsManager.FindFamily(dtoToolWithFamily.FamilyId); if (fam == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); } } else { // Copy only family data from tool&fam model DTONewNcFamilyModel newFamily = new DTONewNcFamilyModel(); SupportFunctions.CopyProperties(dtoToolWithFamily, newFamily); // Add new family DbNcFamilyModel dbFam = toolsManager.AddFamily(newFamily); if (dbFam == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); dtoToolWithFamily.FamilyId = dbFam.FamilyId; } // Check if option is active if (!ToolManagerConfig.ShankOpt) { // If option is not active create a shank DTONewNcShankModel newShank = new DTONewNcShankModel() { Balluf = 0, MagazinePositionType = 0 }; // Create a new shank DbNcShankModel ncShank = toolsManager.AddShank(newShank); // Connect tool to new shank dtoToolWithFamily.ShankId = ncShank.ShankId; } else dtoToolWithFamily.ShankId = null; } using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); // Add tool DTONcToolModel newTool = ncHandler.AddTool(dtoToolWithFamily); return Ok(CreateToolAndFamilyObj(newTool, dtoToolWithFamily)); } } [Route("tool/{toolId:int}"), HttpPut] public IHttpActionResult PutTool(int toolId, [FromBody][Required]DTONewNcToolWithFamilyModel dtoToolWithFamily) { if (!ModelState.IsValid) return BadRequest(ModelState); DbNcToolModel tool = null; using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if tool exists tool = toolsManager.FindTool(toolId); if (tool == null) return NotFound(); if (tool.FamilyId != dtoToolWithFamily.FamilyId) { // Check if family exists DbNcFamilyModel fam = toolsManager.FindFamily(dtoToolWithFamily.FamilyId); if (fam == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); } using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); CmsError cmsError; // If option is active if (!ToolManagerConfig.FamilyOpt) { // Copy only family DTONewNcFamilyModel newFamily = new DTONewNcFamilyModel(); SupportFunctions.CopyProperties(dtoToolWithFamily, newFamily); // Update only family data cmsError = ncHandler.UpdateFamily(dtoToolWithFamily.FamilyId, newFamily, out DTONcFamilyModel newFam); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } // Update cmsError = ncHandler.UpdateTool(toolId, dtoToolWithFamily, out DTONcToolModel newTool); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(CreateToolAndFamilyObj(newTool, dtoToolWithFamily)); } } } private DTONcToolWithFamilyModel CreateToolAndFamilyObj(DTONcToolModel tool, DTONewNcToolWithFamilyModel familyData) { DTONcToolWithFamilyModel familyTool = new DTONcToolWithFamilyModel(); // Copy family fields SupportFunctions.CopyProperties(familyData, familyTool); // Copy tool fields SupportFunctions.CopyProperties(tool, familyTool); return familyTool; } private DTONcToolWithFamilyModel CreateToolAndFamilyObj(DTONcToolModel tool, DTONcFamilyModel familyData) { DTONcToolWithFamilyModel familyTool = new DTONcToolWithFamilyModel(); // Copy family fields SupportFunctions.CopyProperties(familyData, familyTool); // Copy tool fields SupportFunctions.CopyProperties(tool, familyTool); return familyTool; } [Route("tool/{toolId:int}"), HttpDelete] public IHttpActionResult DeleteTool(int toolId) { using (NcToolManagerController toolsManager = new NcToolManagerController()) { DbNcToolModel tool = toolsManager.FindTool(toolId); if (tool == null) return NotFound(); using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); CmsError cmsError; if (!ToolManagerConfig.ShankOpt && tool.ShankId != null) { // If option is active find & delete tool shank DbNcShankModel shank = toolsManager.FindShankWithTools(tool.ShankId.Value); cmsError = ncHandler.DeleteNcShank(shank.ShankId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } if (!ToolManagerConfig.FamilyOpt) { DbNcFamilyModel fam = toolsManager.FindFamily(tool.FamilyId); if(fam.Tools.Count() == 1) { cmsError = ncHandler.DeleteNcFamily(tool.FamilyId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } } cmsError = ncHandler.DeleteNcTool(tool); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(); } } } #endregion Tools #region Offsets [Route("offset/{offsetId:int}"), HttpPut] public IHttpActionResult UpdateOffset(short offsetId, OffsetModel offsetData) { using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); CmsError cmsError = ncHandler.UpdateOffset(offsetId, offsetData); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); offsetData.Id = offsetId; return Ok(offsetData); } } [Route("tool/{toolId:int}/position/{positionId:int}/offset/{offsetId:int}"), HttpPut] public IHttpActionResult UpdateToolOffset(int toolId, int positionId, short offsetId) { using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); CmsError cmsError = ncHandler.UpdateToolOffsetId(toolId, positionId, offsetId, out DTONcToolModel tool); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(tool); } } #endregion #region Shanks [Route("shanks"), HttpGet] public IHttpActionResult GetShanks() { using (NcToolManagerController toolsManager = new NcToolManagerController()) { return Ok(toolsManager.GetShanks()); } } [Route("shank"), HttpPost] public IHttpActionResult AddShank([FromBody][Required] DTONewNcShankModel dtoShank) { if (!ModelState.IsValid) return BadRequest(ModelState); if (!ToolManagerConfig.ShankOpt) return BadRequest(API_ERROR_KEYS.OPTION_NOT_ACTIVE); using (NcToolManagerController toolsManager = new NcToolManagerController()) { DTONcShankModel shank = (DTONcShankModel)toolsManager.AddShank(dtoShank); return Ok(shank); } } [Route("shank/{shankId:int}"), HttpPut] public IHttpActionResult PutShank(int shankId, [FromBody][Required]DTONewNcShankModel dtoShank) { if (!ModelState.IsValid) return BadRequest(ModelState); using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if shank exists DbNcShankModel shank = toolsManager.FindShankWithTools(shankId); if (shank == null) return NotFound(); using (NcHandler ncHandler = new NcHandler()) { CmsError cmsError = ncHandler.Connect(); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); // Update shank cmsError = ncHandler.UpdateShank(shankId, dtoShank, out DTONcShankModel newShank); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(newShank); } } } [Route("shank/{shankId:int}"), HttpDelete] public IHttpActionResult DeleteShank(int shankId) { using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if shank exists DbNcShankModel shank = toolsManager.FindShankWithTools(shankId); if (shank == null) return NotFound(); using (NcHandler ncHandler = new NcHandler()) { CmsError cmsError = ncHandler.Connect(); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); cmsError = ncHandler.DeleteNcShank(shank.ShankId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(); } } } #endregion Shanks #region Families [Route("families"), HttpGet] public IHttpActionResult GetFamilies() { using (NcToolManagerController toolsManager = new NcToolManagerController()) { List families = toolsManager.GetFamilies(); return Ok(families); } } [Route("family"), HttpPost] public IHttpActionResult AddFamily([FromBody][Required]DTONewNcFamilyModel dtoFamily) { if (!ModelState.IsValid) return BadRequest(ModelState); using (NcHandler ncHandler = new NcHandler()) { CmsError cmsError = ncHandler.Connect(); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); DTONcFamilyModel newFamily = ncHandler.AddFamily(dtoFamily); return Ok(newFamily); } } [Route("family/{familyId:int}"), HttpPut] public IHttpActionResult PutFamily(int familyId, [FromBody][Required]DTONewNcFamilyModel dtoFamily) { if (!ModelState.IsValid) return BadRequest(ModelState); using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if family exists DbNcFamilyModel family = toolsManager.FindFamily(familyId); if (family == null) return NotFound(); using (NcHandler ncHandler = new NcHandler()) { CmsError cmsError = ncHandler.Connect(); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); // Update into db and NC cmsError = ncHandler.UpdateFamily(familyId, dtoFamily, out DTONcFamilyModel newFamily); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(newFamily); } } } [Route("family/{familyId:int}"), HttpDelete] public IHttpActionResult DeleteFamily(int familyId) { using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Find if exists DbNcFamilyModel family = toolsManager.FindFamily(familyId); if (family == null) return NotFound(); using (NcHandler ncHandler = new NcHandler()) { CmsError cmsError = ncHandler.Connect(); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); //Delete cmsError = ncHandler.DeleteNcFamily(familyId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(); } } } #endregion Families #region Magazine positions [Route("magazines_positions"), HttpGet] public IHttpActionResult GetMagazinesPositions() { using (NcToolManagerController toolsManager = new NcToolManagerController()) { List magazines = toolsManager.FindMagazinesPositions(); return Ok(magazines); } } [Route("magazine/{magazineId:int}/positions"), HttpGet] public IHttpActionResult GetMagazinesPositions(byte magazineId) { using (NcToolManagerController toolsManager = new NcToolManagerController()) { List magazine = toolsManager.GetMagazinePositions(magazineId); return Ok(magazine); } } [Route("magazine/{magazineId}/position/{positionId}"), HttpPut] public IHttpActionResult PutMagazinePosition([Required]byte magazineId, [Required]byte positionId, [FromBody]DTONcMagazinePositionModel dtoPos) { if (!ModelState.IsValid) return BadRequest(ModelState); using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if magazine&position exists DbNcMagazinePositionModel pos = toolsManager.FindMagazinePosition(magazineId, positionId); if (pos == null) return NotFound(); using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); CmsError cmsError = ncHandler.UpdateMagazinePosition(pos, dtoPos, out DTONcMagazinePositionModel newPos); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(newPos); } } } #endregion Magazine positions [Route("magazine/{magazineId:int}/mounted_shanks"), HttpGet] public IHttpActionResult GetMagazineTools(byte magazineId) { using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if magazine exists List pos = toolsManager.FindMagazinePositions(magazineId); if (pos.Count <= 0) return NotFound(); List mountedShank = toolsManager.GetMountedShanks(magazineId); return Ok(mountedShank); } } [Route("magazine/available_shanks"), HttpGet] public IHttpActionResult GetAvailableShanks() { using (NcToolManagerController toolsManager = new NcToolManagerController()) { List shanks = new List(); shanks = toolsManager.GetAvailableShanksWithChilds(); return Ok(shanks); } } [Route("magazine/available_tools"), HttpGet] public IHttpActionResult GetAvailableTools() { using (NcToolManagerController toolsManager = new NcToolManagerController()) { List tools = toolsManager.GetAvailableTools(); return Ok(tools); } } [Route("magazine/{magazineId:int}/load/position/{positionId:int}"), HttpPut] public IHttpActionResult LoadToolInToMagazine(byte magazineId, byte positionId, [FromBody][Required] DTONcUpdateMagazineModel shankId) { if (!ModelState.IsValid) return BadRequest(ModelState); if (shankId.ShankId == 0) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); // Check data DbNcShankModel shank; using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if shank exists shank = toolsManager.FindShankWithTools(shankId.ShankId); if (shank == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); // Check if shank is already loaded somewhere if (shank.MagazineId != null) return BadRequest(API_ERROR_KEYS.TOOL_IS_MOUNTED); // Check if magazine position exists DbNcMagazinePositionModel magPos = toolsManager.FindMagazinePosition(magazineId, positionId); if (magPos == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); // Check if the mag pos is disabled if (magPos.Disabled == true) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); using (NcHandler ncHandler = new NcHandler()) { // Get Configuration ncHandler.Connect(); // Check if shank can fit CmsError cmsError = ncHandler.CheckIfShankCanFit( magazineId, positionId, shank // Get mounted tools ); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } // Update shank data DTONcMagazinePositionModel magazinePos = (DTONcMagazinePositionModel)toolsManager.LoadShankInMagazine(magazineId, positionId, shank); // Set shankId magazinePos.ShankId = shank.ShankId; return Ok(magazinePos); } } [Route("magazine/{magazineId:int}/unload/position/{positionId:int}"), HttpPut] public IHttpActionResult UnloadToolInToMagazine(byte magazineId, byte positionId, [FromBody][Required] DTONcUpdateMagazineModel shankId) { if (!ModelState.IsValid) return BadRequest(ModelState); if (shankId.ShankId == 0) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); // Check data DbNcShankModel shank; using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if shank exists shank = toolsManager.FindShankWithTools(shankId.ShankId); if (shank == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); // Check if magazine position exists DbNcMagazinePositionModel magPos = toolsManager.FindMagazinePosition(magazineId, positionId); if (magPos == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); // Check if the mag pos is disabled if (magPos.Disabled == true) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); // Check if magazine position is not occupied DbNcShankModel shankMounted = toolsManager.FindShanksByPositions(magazineId, positionId); if (shankMounted == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); DTONcMagazinePositionModel magazinePos = (DTONcMagazinePositionModel)toolsManager.UnloadShankInMagazine(magazineId, positionId, shank); return Ok(magazinePos); } } [Route("shank/{shankId:int}/load/tool/{toolId:int}"), HttpPut] public IHttpActionResult LoadToolIntoShank(int shankId, int toolId) { if (!ModelState.IsValid) return BadRequest(ModelState); DbNcToolModel tool; using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if shank exists DbNcShankModel shank = toolsManager.FindShankWithTools(shankId); if (shank == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); tool = toolsManager.FindTool(toolId); if (tool == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); } using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); DTONcShankModel shank = ncHandler.LoadIntoShank(tool, shankId); return Ok(shank); } } [Route("shank/{shankId:int}/unload/tool/{toolId:int}"), HttpPut] public IHttpActionResult UnloadToolIntoShank(int shankId, int toolId) { if (!ModelState.IsValid) return BadRequest(ModelState); DbNcToolModel tool; using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if shank exists DbNcShankModel shank = toolsManager.FindShankWithTools(shankId); if (shank == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); tool = toolsManager.FindTool(toolId); if (tool == null) return BadRequest(API_ERROR_KEYS.INCORRECT_PARAMETERS); } using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); DTONcShankModel shank = ncHandler.UnloadFromShank(tool); return Ok(shank); } } [Route("start_edit_tooling/{magazineId:int}"), HttpPut] public IHttpActionResult StartEditTooling(int magazineId) { using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); CmsError cmsError = ncHandler.StartEditTooling(magazineId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(); } } [Route("stop_edit_tooling/{magazineId:int}"), HttpPut] public IHttpActionResult StopEditTooling(int magazineId) { using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); CmsError cmsError = ncHandler.StopEditTooling(magazineId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(); } } } }