using DataPROWin7.DataModel; using DTS.Common.Import.Enums; using DTS.Common.Interface.Channels; using DTS.Common.Interface.Groups.GroupList; using DTS.Common.SharedResource.Strings; using DTS.SensorDB; using DTS.Slice.Users; using System; using System.Collections.Generic; using System.Linq; namespace DTS.Common.Import.Persist { //FB 38039 Checkout testsetup save vriant public class SaveCheckoutTestSetup : SaveVariantBase { private readonly SaveCustomChannels _saveCustomChannels; private readonly SaveHardware _saveHardware; private readonly SaveGroups _saveGroups; private readonly string _setupName; public User CurrentUser { get; set; } public SaveCheckoutTestSetup(ImportObject importObject, IPersistCalculator persistCalculator, IImportNotification importNotification, SaveCustomChannels saveCustomChannels, SaveHardware saveHardware, SaveGroups saveGroups, Func isCancelled = null, string setupName = null) : base(importObject, persistCalculator, importNotification, isCancelled) { _saveCustomChannels = saveCustomChannels; _saveHardware = saveHardware; _saveGroups = saveGroups; _setupName = setupName; } private void ConfigureCheckoutTestSetup(TestTemplate TestSetupCheckout) { TestSetupCheckout.DoROIDownload = true; TestSetupCheckout.ViewROIDownload = true; TestSetupCheckout.DownloadAll = true; TestSetupCheckout.ViewDownloadAll = true; TestSetupCheckout.RequireUserConfirmationOnErrors = false; TestSetupCheckout.UploadData = false; TestSetupCheckout.ViewDiagnostics = true; TestSetupCheckout.VerifyChannels = true; TestSetupCheckout.ViewExport = false; TestSetupCheckout.DefaultNumberRealtimeGraphs = 1; TestSetupCheckout.ExportFormats = DTS.Common.Enums.SupportedExportFormatBitFlags.none; // no export for this test TestSetupCheckout.AllowMissingSensors = true; TestSetupCheckout.StrictDiagnostics = false; TestSetupCheckout.AutomaticProgression = true; TestSetupCheckout.DoAutoArm = false; TestSetupCheckout.DoStreaming = false; TestSetupCheckout.DoEnableRepeat = false; TestSetupCheckout.AllowSensorIdToBlankChannel = true; TestSetupCheckout.AllowMissingSensors = true; TestSetupCheckout.CheckoutMode = true; TestSetupCheckout.QuitTestWithoutWarning = true; TestSetupCheckout.SuppressMissingSensorsWarning = true; TestSetupCheckout.NotAllChannelsViewer = true; TestSetupCheckout.NotAllChannelsRealTime = true; TestSetupCheckout.CheckListRequirePass = false; } public override void Save() { var testSetups = _importObject.TestSetups(); if (_importObject.TestSetupImportFileFormat == ImportFileFormat.SingleTestSetup) { var testSetup = testSetups.FirstOrDefault(); if (testSetup == null) { return; } testSetup.Name = _setupName; testSetup.TestId = _setupName; testSetup.TestSetupUniqueId = Guid.NewGuid().ToString(); ConfigureCheckoutTestSetup(testSetup); } Dictionary oldIdToNewIdLookup = new Dictionary(); SaveTestSetupHelper.UpdateLevelTriggers(ref oldIdToNewIdLookup, _saveCustomChannels, testSetups); SaveTestSetupHelper.DeleteExistingTestSetups(testSetups, CurrentUser.UserName); Dictionary hardwareLookup = SaveTestSetupHelper.PopulateHarwareLookup(); _importNotification.SetStatus.Invoke(new ImportStatus { ExtraStatus = ImportExtraStatus.ReadingTestSetups, PossibleStatus = PossibleStatus.Importing }); foreach (var t in testSetups) { SaveTestSetupHelper.FixDasAff(hardwareLookup, t); //keep track of test id prior to commit, so that we can correct das.TestId //if we need to var idPriorToCommit = t.Id; t.Id = 0; Dictionary groupChannelsLookup = new Dictionary(); var allSensorsInDb = SensorsCollection.SensorsList.GetAllSensors(true); foreach (var cfg in t.ChannelsForGroup) { IGroup checkoutGroup = GroupHelper.CreateEmptyGroup(); checkoutGroup.Name = cfg.Key.DisplayName; checkoutGroup.DisplayName = checkoutGroup.Name; checkoutGroup.DisplayOrder = cfg.Key.DisplayOrder; List groupChannelList = new List(); foreach (var ch in cfg.Value) { var match = allSensorsInDb?.FirstOrDefault(s => s.DatabaseId == ch.SensorId); if (null != match) { ch.SetSensorData(match, null, false); } if (_saveHardware.OldDASIdToNewDASId.ContainsKey(ch.DASId)) { ch.DASId = _saveHardware.OldDASIdToNewDASId[ch.DASId]; } //15262 Absolute zero sensors in test setup change to ave over time after import. //zero method may be undefined on older imports //make sure we set the zero method before embedded group is committed ... SaveSensor.FixMissingZeroMethodParameter(ch, _saveGroups.DefaultZeroMethod, _saveGroups.DefaultZeroStart, _saveGroups.DefaultZeroEnd); SaveSensor.FixMissingInitialOffset(ch, _saveGroups.DefaultInitialOffset); groupChannelList.Add(ch); } groupChannelsLookup[checkoutGroup] = groupChannelList.ToArray(); } t.Groups.Clear(); t.ChannelsForGroup.Clear(); t.ChannelsForGroup = groupChannelsLookup; foreach (var g in groupChannelsLookup) { t.Groups.Add(g.Key); } var hardwareIncluded = t.AddedHardware.ToList(); var hardwareRemoved = t.RemovedHardware.ToList(); var listToProcess = new List>(); using (var e = _saveHardware.OldDASIdToNewDASId.GetEnumerator()) { while (e.MoveNext()) { listToProcess.Add(new Tuple(e.Current.Key, e.Current.Value)); } } //arrange the to process by the largest new id listToProcess.Sort((a, b) => { if (a == b) { return 0; } return b.Item2.CompareTo(a.Item2); }); foreach (var tuple in listToProcess) { if (tuple.Item1 == tuple.Item2) { continue; } if (hardwareIncluded.Contains(tuple.Item1)) { hardwareIncluded.Remove(tuple.Item1); hardwareIncluded.Add(tuple.Item2); } if (hardwareRemoved.Contains(tuple.Item1)) { hardwareRemoved.Remove(tuple.Item1); hardwareRemoved.Add(tuple.Item2); } } SaveTestSetupHelper.AddHardwareFromEmbeddedGroups(t, _saveGroups, hardwareRemoved, hardwareIncluded); t.ReplaceCalculatedChannel(oldIdToNewIdLookup); if (IsCancelled()) { return; } TestTemplateList.TestTemplatesList.Commit(t, false); if (idPriorToCommit > 0 && _saveHardware.TestIdToHardware.ContainsKey(idPriorToCommit)) { foreach (var enumH in _saveHardware.TestIdToHardware[idPriorToCommit]) { enumH.TestId = t.Id; enumH.Update(); } } _persistCalculator.AddDone(); _importNotification.SetProgress(_persistCalculator.ProgressValue); } oldIdToNewIdLookup.Clear(); if (_importObject.Errors().Any()) { //report errors } //FB 36879 Still parsing it should report as Working status _importNotification.SetStatus.Invoke(new ImportStatus { ExtraStatus = ImportExtraStatus.None, PossibleStatus = PossibleStatus.Working }); } } }