diff --git a/Client/Client.csproj b/Client/Client.csproj index b0a48572..1a24cfe8 100644 --- a/Client/Client.csproj +++ b/Client/Client.csproj @@ -127,8 +127,8 @@ ..\packages\Microsoft.WindowsAPICodePack-Shell.1.1.0.0\lib\Microsoft.WindowsAPICodePack.ShellExtensions.dll - - ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll diff --git a/Client/packages.config b/Client/packages.config index b31b7df6..32649df5 100644 --- a/Client/packages.config +++ b/Client/packages.config @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/Step.Database/Controllers/NcToolManagerController.cs b/Step.Database/Controllers/NcToolManagerController.cs index e7cd125f..8b4eb34b 100644 --- a/Step.Database/Controllers/NcToolManagerController.cs +++ b/Step.Database/Controllers/NcToolManagerController.cs @@ -549,5 +549,49 @@ namespace Step.Database.Controllers dbCtx.SaveChanges(); } + + public DTOExportToolTableModel GetExportData() + { + return new DTOExportToolTableModel + { + Tools = FindTools(), + Families = FindFamilies(), + Shanks = FindShanks() + }; + } + + public void ImportData(DTOExportToolTableModel data) + { + List tools = FindTools(); + List families = FindFamilies(); + List shanks = FindShanks(); + + // loop thought new families + foreach (var family in data.Families) + { + // Check if not exist + if (families.FirstOrDefault(x => x.FamilyId == family.FamilyId) == null) + dbCtx.Families.Add(family); + } + + // loop thought new shanks + foreach (var shank in data.Shanks) + { + // Check if not exist + if (shanks.FirstOrDefault(x => x.ShankId == shank.ShankId) == null) + dbCtx.Shanks.Add(shank); + } + + // loop thought new tools + foreach (var tool in data.Tools) + { + // Check if not exist + if (tools.FirstOrDefault(x => x.ToolId == tool.ToolId) == null) + dbCtx.Tools.Add(tool); + } + + // Save + dbCtx.SaveChanges(); + } } } \ No newline at end of file diff --git a/Step.Model/DTOModels/AlarmModels/DTOAlarmHistoricModel.cs b/Step.Model/DTOModels/AlarmModels/DTOAlarmHistoricModel.cs index b13ff223..f8c3773d 100644 --- a/Step.Model/DTOModels/AlarmModels/DTOAlarmHistoricModel.cs +++ b/Step.Model/DTOModels/AlarmModels/DTOAlarmHistoricModel.cs @@ -56,6 +56,7 @@ namespace Step.Model.DTOModels.AlarmModels Users = obj.Users.Select(x => x.UserId).ToList() }; } + public string ToCsvString(String alarm) { var alarmCode = 0; diff --git a/Step.Model/DTOModels/Scada/ScadaSchemaModel.cs b/Step.Model/DTOModels/Scada/ScadaSchemaModel.cs index 06b31061..55e98f1d 100644 --- a/Step.Model/DTOModels/Scada/ScadaSchemaModel.cs +++ b/Step.Model/DTOModels/Scada/ScadaSchemaModel.cs @@ -193,6 +193,9 @@ namespace Step.Model.DTOModels.Scada public class ScadaSchemaImgClickModel { + [XmlAttribute("negate")] + public bool Negate { get; set; } + [XmlElement("memVisibleIndex")] public string MemVisibleIndex { get; set; } diff --git a/Step.Model/DTOModels/ToolModels/DTOExportToolTableModel.cs b/Step.Model/DTOModels/ToolModels/DTOExportToolTableModel.cs new file mode 100644 index 00000000..19b7f1e0 --- /dev/null +++ b/Step.Model/DTOModels/ToolModels/DTOExportToolTableModel.cs @@ -0,0 +1,16 @@ +using Step.Model.DatabaseModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Step.Model.DTOModels.ToolModels +{ + public class DTOExportToolTableModel + { + public List Tools { get; set; } + public List Families { get; set; } + public List Shanks { get; set; } + } +} diff --git a/Step.Model/DatabaseModels/NcFamilyModel.cs b/Step.Model/DatabaseModels/NcFamilyModel.cs index e98e4fa6..6b50ceab 100644 --- a/Step.Model/DatabaseModels/NcFamilyModel.cs +++ b/Step.Model/DatabaseModels/NcFamilyModel.cs @@ -1,7 +1,9 @@ using CMS_CORE_Library.Models; +using Newtonsoft.Json; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; namespace Step.Model.DatabaseModels { @@ -67,6 +69,8 @@ namespace Step.Model.DatabaseModels [Column("revive_delta")] public int ReviveDelta { get; set; } + [JsonIgnore] + [IgnoreDataMember] public List Tools { get; set; } public static explicit operator NcFamilyModel(DbNcFamilyModel obj) diff --git a/Step.Model/DatabaseModels/NcShankModel.cs b/Step.Model/DatabaseModels/NcShankModel.cs index 4684751e..efbc4534 100644 --- a/Step.Model/DatabaseModels/NcShankModel.cs +++ b/Step.Model/DatabaseModels/NcShankModel.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; using CMS_CORE_Library.Models; +using Newtonsoft.Json; namespace Step.Model.DatabaseModels { @@ -33,8 +35,13 @@ namespace Step.Model.DatabaseModels public int? OriginPositionId { get; set; } + [JsonIgnore] + [IgnoreDataMember] public DbNcMagazinePositionModel MagazinePosition { get; set; } + + [JsonIgnore] + [IgnoreDataMember] public List Tools { get; set; } public static explicit operator NcShankModel(DbNcShankModel obj) diff --git a/Step.Model/DatabaseModels/NcToolModel.cs b/Step.Model/DatabaseModels/NcToolModel.cs index b6c5e8d6..8f0c496c 100644 --- a/Step.Model/DatabaseModels/NcToolModel.cs +++ b/Step.Model/DatabaseModels/NcToolModel.cs @@ -1,6 +1,8 @@ using CMS_CORE_Library.Models; +using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using System.Runtime.Serialization; namespace Step.Model.DatabaseModels { @@ -44,7 +46,12 @@ namespace Step.Model.DatabaseModels [Column("offsetId3")] public short? OffsetId3 { get; set; } + [JsonIgnore] + [IgnoreDataMember] public virtual DbNcFamilyModel Family { get; set; } + + [JsonIgnore] + [IgnoreDataMember] public virtual DbNcShankModel Shank { get; set; } public static explicit operator NcToolModel(DbNcToolModel obj) diff --git a/Step.Model/Step.Model.csproj b/Step.Model/Step.Model.csproj index 5aa357fd..015ea471 100644 --- a/Step.Model/Step.Model.csproj +++ b/Step.Model/Step.Model.csproj @@ -48,6 +48,9 @@ ..\packages\Microsoft.AspNet.Identity.EntityFramework.2.2.1\lib\net45\Microsoft.AspNet.Identity.EntityFramework.dll + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll + @@ -114,6 +117,7 @@ + diff --git a/Step.Model/packages.config b/Step.Model/packages.config index 847fed35..3d1459a4 100644 --- a/Step.Model/packages.config +++ b/Step.Model/packages.config @@ -3,4 +3,5 @@ + \ No newline at end of file diff --git a/Step.NC/NcHandler.cs b/Step.NC/NcHandler.cs index ddf199cd..6079371c 100644 --- a/Step.NC/NcHandler.cs +++ b/Step.NC/NcHandler.cs @@ -1002,11 +1002,13 @@ namespace Step.NC cmsError = numericalControl.PLC_RScadaValue(layer.Images[i].Status.MemVisibleIndex, SCADA_MEM_TYPE.BOOL, ref val); if (cmsError.IsError()) return cmsError; + + var negate = layer.Images[i].Status.Negate; // Populate & add new object into scada model scadaValue.Images.Add(new DTOScadaImageModel() { Id = layer.Images[i].Id, - IsVisible = Convert.ToBoolean(val) + IsVisible = negate ? !Convert.ToBoolean(val) : Convert.ToBoolean(val) }); } diff --git a/Step.Utils/Step.Utils.csproj b/Step.Utils/Step.Utils.csproj index 1463258c..593b3bee 100644 --- a/Step.Utils/Step.Utils.csproj +++ b/Step.Utils/Step.Utils.csproj @@ -39,8 +39,8 @@ ..\packages\MySql.Data.6.10.4\lib\net452\MySql.Data.dll - - ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll ..\packages\NLog.4.5.11\lib\net45\NLog.dll diff --git a/Step.Utils/packages.config b/Step.Utils/packages.config index 9ce80806..45860def 100644 --- a/Step.Utils/packages.config +++ b/Step.Utils/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/Step/App.config b/Step/App.config index 2bc9b8f8..084004f0 100644 --- a/Step/App.config +++ b/Step/App.config @@ -34,7 +34,7 @@ - + diff --git a/Step/Controllers/WebApi/ApiAlarmController.cs b/Step/Controllers/WebApi/ApiAlarmController.cs index 902900cd..1cd1c326 100644 --- a/Step/Controllers/WebApi/ApiAlarmController.cs +++ b/Step/Controllers/WebApi/ApiAlarmController.cs @@ -59,6 +59,7 @@ namespace Step.Controllers.WebApi using (AlarmsController alarm = new AlarmsController()) { + // Get alarms from database List alarms = alarm.GetPaginatedWithFilter(filter.Title, filter.Sources, 0, int.MaxValue, filter.StartDate.Value, filter.EndDate, filter.UserIds, plcMessages, out int pages); Dictionary AlmPLCTras = LanguageController.GetPlcAlarmsTranslations(filter.Language); @@ -68,7 +69,7 @@ namespace Step.Controllers.WebApi { var alm = ""; if(model.Source == ALARM_SOURCE.PLC) - alm = AlmPLCTras["alarm_"+model.AlarmId]; + alm = AlmPLCTras["alarm_" + model.AlarmId]; csv += model.ToCsvString(alm) + Environment.NewLine; } @@ -87,10 +88,7 @@ namespace Step.Controllers.WebApi result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv"); return ResponseMessage(result); - - } - } [Route("data"), HttpPost] diff --git a/Step/Controllers/WebApi/NcToolManagerController.cs b/Step/Controllers/WebApi/NcToolManagerController.cs index 00fd3bc4..af22bcf5 100644 --- a/Step/Controllers/WebApi/NcToolManagerController.cs +++ b/Step/Controllers/WebApi/NcToolManagerController.cs @@ -1,6 +1,8 @@ using CMS_CORE_Library.Models; +using Newtonsoft.Json; using Step.Database.Controllers; using Step.Model.DatabaseModels; +using Step.Model.DTOModels; using Step.Model.DTOModels.ToolModels; using Step.NC; using Step.Utils; @@ -8,12 +10,17 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Diagnostics; +using System.IO; using System.Linq; +using System.Net; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using System.Web; using System.Web.Http; using static Step.Config.ServerConfig; -using static Step.Model.Constants; using static Step.Listeners.SignalRStaticObjects; -using Step.Model.DTOModels; +using static Step.Model.Constants; namespace Step.Controllers.WebApi { @@ -152,12 +159,12 @@ namespace Step.Controllers.WebApi [Route("tool/{toolId:int}/{familyId:int}"), HttpPost] public IHttpActionResult AddToolWithId(short toolId, short familyId) - { + { using (NcToolManagerController toolsManager = new NcToolManagerController()) { // Check if exists a tool with the same id DbNcToolModel dbTool = toolsManager.FindTool(toolId); - if(dbTool != null) + if (dbTool != null) return BadRequest(API_ERROR_KEYS.ID_ALREADY_EXIST); // Create default family @@ -177,8 +184,8 @@ namespace Step.Controllers.WebApi // Check Family id // 0 : Create new family // N : Set tool familyId with input id - - if(familyId == 0) + + if (familyId == 0) // Add new family dbFam = toolsManager.AddFamily(defaultFamily); else @@ -274,12 +281,12 @@ namespace Step.Controllers.WebApi { dtoToolWithFamily.Name = fam.Name; } - } + } using (NcToolTableHandler ncHandler = new NcToolTableHandler()) { ncHandler.Connect(); - + // Update CmsError cmsError = ncHandler.UpdateTool(toolId, dtoToolWithFamily, out DTONcToolModel newTool, dtoToolWithFamily); if (cmsError.IsError()) @@ -380,12 +387,12 @@ namespace Step.Controllers.WebApi CmsError cmsError = ncHandler.UpdateToolOffsetId(toolId, positionId, offsetId, out DTONcToolModel tool); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); - + return Ok(tool); } } - #endregion + #endregion Offsets #region Shanks @@ -551,7 +558,7 @@ namespace Step.Controllers.WebApi } } - [Route("family/{familyId:int}"), HttpDelete] + [Route("family/{familyId:int}"), HttpDelete] public IHttpActionResult DeleteFamily(int familyId) { using (NcToolManagerController toolsManager = new NcToolManagerController()) @@ -723,7 +730,6 @@ namespace Step.Controllers.WebApi if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); - dtoShank = toolsManager.GetShank(shank.ShankId); } @@ -865,7 +871,7 @@ namespace Step.Controllers.WebApi Stopwatch st = new Stopwatch(); st.Restart(); CmsError cmsError = ncHandler.StopEditTooling(magazineId); - Console.WriteLine("TOOL TABLE WRITE TIME "+ st.ElapsedMilliseconds); + Console.WriteLine("TOOL TABLE WRITE TIME " + st.ElapsedMilliseconds); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); @@ -880,9 +886,9 @@ namespace Step.Controllers.WebApi { ncHandler.Connect(); - using(NcToolManagerController toolsManager = new NcToolManagerController()) + using (NcToolManagerController toolsManager = new NcToolManagerController()) { - var tool = toolsManager.FindTool(data.ToolId); + var tool = toolsManager.FindTool(data.ToolId); if (tool == null) return BadRequest(); @@ -897,9 +903,9 @@ namespace Step.Controllers.WebApi private bool ToolIsInSpindle(int toolId) { - foreach(var head in LastHeadsData.ToList()) + foreach (var head in LastHeadsData.ToList()) { - if(head is DTOSpindleModel) + if (head is DTOSpindleModel) { var spindle = head as DTOSpindleModel; if (spindle.MountedTool == toolId) @@ -909,5 +915,48 @@ namespace Step.Controllers.WebApi return false; } + + [Route("export"), HttpPost] + public IHttpActionResult ExportToolTable() + { + if (!ModelState.IsValid) + return BadRequest(ModelState); + + using (NcToolManagerController toolsManager = new NcToolManagerController()) + { + DTOExportToolTableModel expData = toolsManager.GetExportData(); + + return Ok(expData); + } + } + + [Route("import"), HttpPost] + public async Task ImportToolTable() + { + // Check whether the POST operation is MultiPart? + if (!Request.Content.IsMimeMultipartContent()) + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + + var filesReadToProvider = await Request.Content.ReadAsMultipartAsync(); + + var stream = filesReadToProvider.Contents.FirstOrDefault(); + var fileBytes = await stream.ReadAsByteArrayAsync(); + + // Convert bytes into json string + string jsonString = Encoding.UTF8.GetString(fileBytes); + // Deserialize the string into DTO object + DTOExportToolTableModel importData = JsonConvert.DeserializeObject(jsonString); + + using ( NcToolManagerController toolsManager = new NcToolManagerController()) + { + Stopwatch st = new Stopwatch(); + st.Start(); + // Import data in the database + toolsManager.ImportData(importData); + Console.WriteLine(st.ElapsedMilliseconds); + } + + return Ok(); + } } } \ No newline at end of file diff --git a/Step/Step.csproj b/Step/Step.csproj index 97d2f8cc..97be5ee9 100644 --- a/Step/Step.csproj +++ b/Step/Step.csproj @@ -101,8 +101,8 @@ ..\packages\microsoft-web-helpers.2.1.20710.2\lib\net40\Microsoft.Web.Helpers.dll - - ..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll + + ..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll ..\packages\Owin.1.0\lib\net40\Owin.dll @@ -127,6 +127,7 @@ + ..\packages\Microsoft.AspNet.WebPages.2.0.20505.0\lib\net40\System.Web.Helpers.dll diff --git a/Step/packages.config b/Step/packages.config index a22fd13a..4237e905 100644 --- a/Step/packages.config +++ b/Step/packages.config @@ -32,7 +32,7 @@ - + diff --git a/Step/wwwroot/assets/styles/base/tooling.less b/Step/wwwroot/assets/styles/base/tooling.less index 4ba8cb95..c5ae8c5e 100644 --- a/Step/wwwroot/assets/styles/base/tooling.less +++ b/Step/wwwroot/assets/styles/base/tooling.less @@ -24,11 +24,56 @@ overflow: hidden; .header{ font-size: 24px; - font-weight: 600; + font-weight: 600; color: @color-darkish-blue; - margin-top: 18px; - margin-left: 24px; - margin-bottom:19px; + height: 65px; + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + .title { + margin-left: 24px; + } + + .btn { + box-sizing: border-box; + border-radius: 2px; + margin: 0 8px; + text-align: center; + font-size: 18px; + font-weight: bold; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4); + padding: 14px 17px; + border: none; + background-image: linear-gradient(to bottom, @color-white2, @color-silver); + color: @color-darkish-blue; + + &:active { + background-image: linear-gradient(to bottom, @color-silver, @color-white2); + border: none !important; + box-shadow: inset @button-shadow !important; + } + + &:hover { + box-shadow: inset 0px 0px 0px 2px #8eb5e2; + } + + &.dark-blue { + background-color: @color-blue; + color: white; + } + + &.btn-danger { + color: @color-scarlet; + } + } + + .group-button-add-attach { + font-size: 18px; + line-height: 1; + // color: @color-greyish-brown; + color: @button-success-color-to; + } } .tooling-boxbody{ width: 100%; diff --git a/Step/wwwroot/assets/styles/style.css b/Step/wwwroot/assets/styles/style.css index 650ea952..2ee8b292 100644 --- a/Step/wwwroot/assets/styles/style.css +++ b/Step/wwwroot/assets/styles/style.css @@ -6744,9 +6744,47 @@ footer .container button.big:before { font-size: 24px; font-weight: 600; color: #002680; - margin-top: 18px; + height: 65px; + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; +} +.tooling-container .tooling-box .header .title { margin-left: 24px; - margin-bottom: 19px; +} +.tooling-container .tooling-box .header .btn { + box-sizing: border-box; + border-radius: 2px; + margin: 0 8px; + text-align: center; + font-size: 18px; + font-weight: bold; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.4); + padding: 14px 17px; + border: none; + background-image: linear-gradient(to bottom, #f1f1f1, #bbbcbc); + color: #002680; +} +.tooling-container .tooling-box .header .btn:active { + background-image: linear-gradient(to bottom, #bbbcbc, #f1f1f1); + border: none !important; + box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.4) !important; +} +.tooling-container .tooling-box .header .btn:hover { + box-shadow: inset 0px 0px 0px 2px #8eb5e2; +} +.tooling-container .tooling-box .header .btn.dark-blue { + background-color: #002680; + color: white; +} +.tooling-container .tooling-box .header .btn.btn-danger { + color: #d0021b; +} +.tooling-container .tooling-box .header .group-button-add-attach { + font-size: 18px; + line-height: 1; + color: #002680; } .tooling-container .tooling-box .tooling-boxbody { width: 100%; diff --git a/Step/wwwroot/src/app_modules/tooling/components/tooling.ts b/Step/wwwroot/src/app_modules/tooling/components/tooling.ts index f7abe6b9..10d144ab 100644 --- a/Step/wwwroot/src/app_modules/tooling/components/tooling.ts +++ b/Step/wwwroot/src/app_modules/tooling/components/tooling.ts @@ -8,6 +8,7 @@ import { Watch } from "vue-property-decorator"; import { DepotActionLoading, DepotActionUnloading, DepotActionTransfer, DepotActionGeneric } from "../"; import { awaiter } from "src/_base"; import { ModalHelper } from "src/components/modals"; +import { DepotService } from "src/services/depotService"; @Component({ name: "tooling", components: { card: card } }) @@ -81,4 +82,12 @@ export default class Tooling extends Vue { public goTo = function (path: string) { this.$router.push({ path: path }); } + + public exportToolTable(){ + new DepotService().exportMagazines() + } + + async onChangeFile(e) { + new DepotService().sendImportFile(e.target.files[0]); + } } diff --git a/Step/wwwroot/src/app_modules/tooling/components/tooling.vue b/Step/wwwroot/src/app_modules/tooling/components/tooling.vue index 11d4b60f..3b92062e 100644 --- a/Step/wwwroot/src/app_modules/tooling/components/tooling.vue +++ b/Step/wwwroot/src/app_modules/tooling/components/tooling.vue @@ -2,7 +2,14 @@
- {{'tooling_title_label' | localize("Tool-Manager")}} + {{'tooling_title_label' | localize("Tool-Manager")}} +
+ + +
diff --git a/Step/wwwroot/src/services/alarmsService.ts b/Step/wwwroot/src/services/alarmsService.ts index be4e0f0c..35012fb2 100644 --- a/Step/wwwroot/src/services/alarmsService.ts +++ b/Step/wwwroot/src/services/alarmsService.ts @@ -13,7 +13,6 @@ export class AlarmsService extends baseRestService { async exportAlarms(title: string, sources: Array, users?: Array, fromDate?: Date, toDate?: Date) { - let result = await this.Post(this.BASE_URL + "export", { "page": 0, @@ -33,8 +32,6 @@ export class AlarmsService extends baseRestService { document.body.appendChild(link); link.click(); }); - - } async getAlarms(title: string, sources: Array, users?: Array, fromDate?: Date, toDate?: Date, page: number = 0, pagesize: number = 100): diff --git a/Step/wwwroot/src/services/depotService.ts b/Step/wwwroot/src/services/depotService.ts index f0606af9..31af7f5d 100644 --- a/Step/wwwroot/src/services/depotService.ts +++ b/Step/wwwroot/src/services/depotService.ts @@ -90,4 +90,21 @@ export class DepotService extends baseRestService { return result } + async exportMagazines() + { + let result = await this.Post(this.BASE_URL + "nc/export", {}, true) + + const url = window.URL.createObjectURL(new Blob([JSON.stringify(result, null, 4)])); + const link = document.createElement('a'); + link.href = url; + link.setAttribute('download', 'AlarmExport.json'); + document.body.appendChild(link); + link.click(); + } + + async sendImportFile(file) { + let result = await this.upload(this.BASE_URL + "nc/import", file, file.name, {}); + + return result; + } }