diff --git a/.gitignore b/.gitignore index c1a1b8f..ad9f179 100644 --- a/.gitignore +++ b/.gitignore @@ -338,6 +338,7 @@ ASALocalRun/ !**/.vscode/settings.json !**/.vscode/tasks.json !**/.vscode/mklink.md +!**/.vscode/*.http *.lnk diff --git a/Adaptation/.vscode/download-work-items.http b/Adaptation/.vscode/download-work-items.http new file mode 100644 index 0000000..a603bda --- /dev/null +++ b/Adaptation/.vscode/download-work-items.http @@ -0,0 +1,9 @@ +@host = https://tfs.intra.infineon.com +@pat = asdf +@ids = 126018, 224543 + +GET {{host}}/tfs/FactoryIntegration/_apis/wit/workitems?ids={{ids}}&$expand=Relations +Accept: application/json +Authorization: Basic {{pat}} + +### diff --git a/Adaptation/.vscode/localhost.http b/Adaptation/.vscode/localhost.http new file mode 100644 index 0000000..e33c069 --- /dev/null +++ b/Adaptation/.vscode/localhost.http @@ -0,0 +1,20 @@ +@host = http://localhost:8071/ + +GET {{host}}/api/v1/ado +Accept: application/json + +### + +POST {{host}}/api/v1/ado +Content-Type: application/json +Accept: application/json + +{ + "id": 109734, + "machineId": "", + "page": "risk", + "site": "MES", + "time": 1743438398094, + "username": "", + "value": "3" +} \ No newline at end of file diff --git a/Adaptation/.vscode/priority.http b/Adaptation/.vscode/priority.http new file mode 100644 index 0000000..9ed61a5 --- /dev/null +++ b/Adaptation/.vscode/priority.http @@ -0,0 +1,31 @@ +@host = https://eaf-dev.mes.infineon.com +@page = api/v1/ado/ + +POST {{host}}/{{page}}/ +Accept: application/json + +{ + "id": "110738", + "machineId": "30ef1b54e075c5370ce74eea2042cb750be659696b170f8758d219a8f9a88e10", + "page": "time", + "site": "MES", + "time": "1744339499677", + "username": "phares", + "value": "3" +} +### + +GET {{host}}/{{page}}/ +Accept: application/json + +{ + "id": 109736, + "machineId": "", + "page": "risk", + "site": "MES", + "time": 1744335005066, + "username": "phares", + "value": "2" +} + +### diff --git a/Adaptation/.vscode/settings.json b/Adaptation/.vscode/settings.json index 8e67af0..ea62388 100644 --- a/Adaptation/.vscode/settings.json +++ b/Adaptation/.vscode/settings.json @@ -8,6 +8,7 @@ "EQPT", "headerid", "Idrv", + "Infineon", "ipdsf", "Irng", "ISMTP", diff --git a/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs index 65bc0f0..e01cba3 100644 --- a/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs +++ b/Adaptation/FileHandlers/MoveMatchingFiles/FileRead.cs @@ -67,6 +67,8 @@ public class FileRead : Shared.FileRead, IFileRead } + private readonly ProcessDataStandardFormatMapping _ProcessDataStandardFormatMapping; + public FileRead(ISMTP smtp, Dictionary fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList modelObjectParameters, string equipmentDictionaryName, Dictionary> dummyRuns, Dictionary> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : base(new Description(), false, smtp, fileParameter, cellInstanceName, connectionCount, cellInstanceConnectionName, fileConnectorConfiguration, equipmentTypeName, parameterizedModelObjectDefinitionType, modelObjectParameters, equipmentDictionaryName, dummyRuns, staticRuns, useCyclicalForDescription, isEAFHosted: connectionCount is null) { @@ -79,6 +81,12 @@ public class FileRead : Shared.FileRead, IFileRead throw new Exception(cellInstanceConnectionName); if (!_IsDuplicator) throw new Exception(cellInstanceConnectionName); + string processDataStandardFormatMappingOldColumnNames = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "Process.Data.Standard.Format.Mapping.Old.Column.Names"); + string processDataStandardFormatMappingNewColumnNames = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "Process.Data.Standard.Format.Mapping.New.Column.Names"); + string processDataStandardFormatMappingColumnIndices = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "Process.Data.Standard.Format.Mapping.Column.Indices"); + _ProcessDataStandardFormatMapping = GetProcessDataStandardFormatMapping(processDataStandardFormatMappingOldColumnNames, + processDataStandardFormatMappingNewColumnNames, + processDataStandardFormatMappingColumnIndices); } void IFileRead.Move(Tuple> extractResults, Exception exception) @@ -157,7 +165,7 @@ public class FileRead : Shared.FileRead, IFileRead return results; } - private static ProcessDataStandardFormatMapping GetProcessDataStandardFormatMapping() + private static ProcessDataStandardFormatMapping GetProcessDataStandardFormatMapping(string processDataStandardFormatMappingOldColumnNames, string processDataStandardFormatMappingNewColumnNames, string processDataStandardFormatMappingColumnIndices) { ProcessDataStandardFormatMapping result; string[] segmentsB; @@ -167,16 +175,16 @@ public class FileRead : Shared.FileRead, IFileRead string args5 = "Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,AreaDeltaFromLastRun,Variation,Percentage HgCV 4PP Delta,HGCV1"; string args6 = "RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09,HGCV1"; string args7 = "FlatZMean|MeanFlatZ,GradeMean|MeanGrade,NAvgMean|MeanNAvg,NslMean|MeanNsl,PhaseMean|MeanPhase,RhoAvgMean|MeanRhoAvg,RhoslMean|MeanRhosl,RsMean|MeanRs,VdMean|MeanVd,FlatZRadialGradient|RadialGradientFlatZ,GradeRadialGradient|RadialGradientGrade,NAvgRadialGradient|RadialGradientNAvg,NslRadialGradient|RadialGradientNsl,PhaseRadialGradient|RadialGradientPhase,RhoAvgRadialGradient|RadialGradientRhoAvg,RhoslRadialGradient|RadialGradientRhosl,RsRadialGradient|RadialGradientRs,VdRadialGradient|RadialGradientVd,FlatZStdDev|StandardDeviationPercentageFlatZ,GradeStdDev|StandardDeviationPercentageGrade,NAvgStdDev|StandardDeviationPercentageNAvg,NslStdDev|StandardDeviationPercentageNsl,PhaseStdDev|StandardDeviationPercentagePhase,RhoAvgStdDev|StandardDeviationPercentageRhoAvg,RhoslStdDev|StandardDeviationPercentageRhosl,RsStdDev|StandardDeviationPercentageRs,VdStdDev|StandardDeviationPercentageVd,|HGCV1"; - string args8 = "Time,A_LOGISTICS,B_LOGISTICS,Test,Count,Index,MesEntity,Date,Employee,Lot,PSN,Reactor,Recipe,Area,Folder,HeaderUniqueId,Id,Layer,Model,Pattern,Phase,Plan,RampRate,RDS,SetupFile,StartVoltage,StopVoltage,UniqueId,Wafer,WaferSize,Zone,Ccomp,CondType,FlatZ,FlatZMean,FlatZRadialGradient,FlatZStdDev,GLimit,Grade,GradeMean,GradeRadialGradient,GradeStdDev,NAvg,NAvgMean,NAvgRadialGradient,NAvgStdDev,Nsl,NslMean,NslRadialGradient,NslStdDev,PhaseMean,PhaseRadialGradient,PhaseStdDev,RhoAvg,RhoAvgMean,RhoAvgRadialGradient,RhoAvgStdDev,RhoMethod,Rhosl,RhoslMean,RhoslRadialGradient,RhoslStdDev,RsMean,RsRadialGradient,RsStdDev,Vd,VdMean,VdRadialGradient,VdStdDev,Variation,AreaDeltaFromLastRun,Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09"; - string args9 = "Time,A_LOGISTICS,B_LOGISTICS,Index,Operator,StartVoltage,Wafer,StopVoltage,Lot,RampRate,Plan,GLimit,Date,Time,SetupFile,WaferSize,Folder,Ccomp,Pattern,Area,CondType,RhoMethod,Model,MeanNAvg,MeanNsl,MeanVd,MeanFlatZ,MeanRhoAvg,MeanRhosl,MeanPhase,MeanGrade,MeanRs,StandardDeviationPercentageNAvg,StandardDeviationPercentageNsl,StandardDeviationPercentageVd,StandardDeviationPercentageFlatZ,StandardDeviationPercentageRhoAvg,StandardDeviationPercentageRhosl,StandardDeviationPercentagePhase,StandardDeviationPercentageGrade,StandardDeviationPercentageRs,RadialGradientNAvg,RadialGradientNsl,RadialGradientVd,RadialGradientFlatZ,RadialGradientRhoAvg,RadialGradientRhosl,RadialGradientPhase,RadialGradientGrade,RadialGradientRs,Site,X,Y,NAvg,RhoAvg,Nsl,Rhosl,Vd,Phase,FlatZ,Grade,XLeft,XRight,BottomY,TopY,RDS,PSN,Reactor,Layer,Zone,Employee,InferredLot,Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,AreaDeltaFromLastRun,Variation,Percentage HgCV 4PP Delta,RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09"; - string args10 = "0,1,2,-1,-1,3,-1,12,70,8,66,67,-1,19,16,-1,-1,68,22,18,58,10,9,65,14,5,7,-1,6,15,69,17,20,59,26,44,35,11,60,30,48,39,53,23,41,32,55,24,42,33,29,47,38,54,27,45,36,21,56,28,46,37,31,49,40,57,25,43,34,81,80,72,73,74,75,76,77,78,79,83,84,85,86,87,88,89,90,91"; + // string args8 = "Time,A_LOGISTICS,B_LOGISTICS,Test,Count,Index,MesEntity,Date,Employee,Lot,PSN,Reactor,Recipe,Area,Folder,HeaderUniqueId,Id,Layer,Model,Pattern,Phase,Plan,RampRate,RDS,SetupFile,StartVoltage,StopVoltage,UniqueId,Wafer,WaferSize,Zone,Ccomp,CondType,FlatZ,FlatZMean,FlatZRadialGradient,FlatZStdDev,GLimit,Grade,GradeMean,GradeRadialGradient,GradeStdDev,NAvg,NAvgMean,NAvgRadialGradient,NAvgStdDev,Nsl,NslMean,NslRadialGradient,NslStdDev,PhaseMean,PhaseRadialGradient,PhaseStdDev,RhoAvg,RhoAvgMean,RhoAvgRadialGradient,RhoAvgStdDev,RhoMethod,Rhosl,RhoslMean,RhoslRadialGradient,RhoslStdDev,RsMean,RsRadialGradient,RsStdDev,Vd,VdMean,VdRadialGradient,VdStdDev,Variation,AreaDeltaFromLastRun,Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09"; + // string args9 = "Time,A_LOGISTICS,B_LOGISTICS,Index,Operator,StartVoltage,Wafer,StopVoltage,Lot,RampRate,Plan,GLimit,Date,Time,SetupFile,WaferSize,Folder,Ccomp,Pattern,Area,CondType,RhoMethod,Model,MeanNAvg,MeanNsl,MeanVd,MeanFlatZ,MeanRhoAvg,MeanRhosl,MeanPhase,MeanGrade,MeanRs,StandardDeviationPercentageNAvg,StandardDeviationPercentageNsl,StandardDeviationPercentageVd,StandardDeviationPercentageFlatZ,StandardDeviationPercentageRhoAvg,StandardDeviationPercentageRhosl,StandardDeviationPercentagePhase,StandardDeviationPercentageGrade,StandardDeviationPercentageRs,RadialGradientNAvg,RadialGradientNsl,RadialGradientVd,RadialGradientFlatZ,RadialGradientRhoAvg,RadialGradientRhosl,RadialGradientPhase,RadialGradientGrade,RadialGradientRs,Site,X,Y,NAvg,RhoAvg,Nsl,Rhosl,Vd,Phase,FlatZ,Grade,XLeft,XRight,BottomY,TopY,RDS,PSN,Reactor,Layer,Zone,Employee,InferredLot,Nine10mmEdgeMean,Nine4mmEdgeMean,NineCriticalPointsAverage,NineCriticalPointsPhaseAngleAverage,NineCriticalPointsStdDev,NineEdgeMeanDelta,NineMean,NineResRangePercent,AreaDeltaFromLastRun,Variation,Percentage HgCV 4PP Delta,RhoAvg01,RhoAvg02,RhoAvg03,RhoAvg04,RhoAvg05,RhoAvg06,RhoAvg07,RhoAvg08,RhoAvg09"; + // string args10 = "0,1,2,-1,-1,3,-1,12,70,8,66,67,-1,19,16,-1,-1,68,22,18,58,10,9,65,14,5,7,-1,6,15,69,17,20,59,26,44,35,11,60,30,48,39,53,23,41,32,55,24,42,33,29,47,38,54,27,45,36,21,56,28,46,37,31,49,40,57,25,43,34,81,80,72,73,74,75,76,77,78,79,83,84,85,86,87,88,89,90,91"; string[] segments = args7.Split(','); ReadOnlyCollection ignoreColumns = new(args4.Split(',')); - ReadOnlyCollection newColumnNames = new(args9.Split(',')); - ReadOnlyCollection oldColumnNames = new(args8.Split(',')); ReadOnlyCollection backfillColumns = new(args5.Split(',')); ReadOnlyCollection indexOnlyColumns = new(args6.Split(',')); - ReadOnlyCollection columnIndices = new(args10.Split(',').Select(int.Parse).ToArray()); + ReadOnlyCollection newColumnNames = new(processDataStandardFormatMappingNewColumnNames.Split(',')); + ReadOnlyCollection oldColumnNames = new(processDataStandardFormatMappingOldColumnNames.Split(',')); + ReadOnlyCollection columnIndices = new(processDataStandardFormatMappingColumnIndices.Split(',').Select(int.Parse).ToArray()); foreach (string segment in segments) { segmentsB = segment.Split('|'); @@ -333,8 +341,7 @@ public class FileRead : Shared.FileRead, IFileRead private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) { Tuple> results = new(string.Empty, Array.Empty(), Array.Empty(), new List()); - ProcessDataStandardFormatMapping processDataStandardFormatMapping = GetProcessDataStandardFormatMapping(); - ProcessDataStandardFormat? processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath, processDataStandardFormatMapping); + ProcessDataStandardFormat? processDataStandardFormat = ProcessDataStandardFormat.GetProcessDataStandardFormat(reportFullPath, _ProcessDataStandardFormatMapping); if (processDataStandardFormat is not null) _Logistics = new Logistics(reportFullPath, processDataStandardFormat); else diff --git a/Adaptation/FileHandlers/Priority/Aggregation.cs b/Adaptation/FileHandlers/Priority/Aggregation.cs index d568a2b..d0ffef5 100644 --- a/Adaptation/FileHandlers/Priority/Aggregation.cs +++ b/Adaptation/FileHandlers/Priority/Aggregation.cs @@ -45,6 +45,7 @@ public class Aggregation private static ReadOnlyDictionary GetKeyValuePairs(Settings settings, Dictionary> keyValuePairs) { Dictionary results = new(); + int value; int? inverseValue; double inverseAverage; Aggregation aggregation; @@ -60,7 +61,9 @@ public class Aggregation fibonacciCollection.Clear(); foreach (Notification notification in keyValuePair.Value) { - collection.Add(notification.Value); + if (!int.TryParse(notification.Value, out value)) + continue; + collection.Add(value); if (notification.Inverse is null) continue; inverseCollection.Add(notification.Inverse.Value); @@ -72,7 +75,7 @@ public class Aggregation continue; inverseAverage = Math.Round(inverseCollection.Average(), settings.Digits); averageFromInverseCeiling = (int)Math.Ceiling(inverseAverage); - inverseValue = Notification.GetInverse(averageFromInverseCeiling); + inverseValue = Notification.GetInverse(averageFromInverseCeiling.ToString()); fibonacciAverage = Math.Round(fibonacciCollection.Average(), settings.Digits); aggregation = new(inverseAverage: inverseAverage, valueCount: collection.Count, @@ -107,9 +110,9 @@ public class Aggregation if (string.IsNullOrEmpty(text) || text[0] == '[') continue; notification = JsonSerializer.Deserialize(text, NotificationSourceGenerationContext.Default.Notification); - if (notification is null || notification.Id == 0) + if (notification is null || string.IsNullOrEmpty(notification.Id)) continue; - key = !string.IsNullOrEmpty(notification.Username) ? notification.Username : notification.RemoteIpAddress; + key = !string.IsNullOrEmpty(notification.Username) ? notification.Username : throw new Exception(); if (string.IsNullOrEmpty(key)) continue; if (!keyValuePairs.TryGetValue(key, out collection)) @@ -126,7 +129,7 @@ public class Aggregation results.Add(keyValuePair.Value[0]); else { - notification = keyValuePair.Value.Select(record => new KeyValuePair(record.Time, record)).OrderBy(pair => pair.Key).Last().Value; + notification = keyValuePair.Value.Select(record => new KeyValuePair(record.Time, record)).OrderBy(pair => pair.Key).Last().Value; results.Add(notification); } } @@ -137,15 +140,18 @@ public class Aggregation private static ReadOnlyDictionary GetKeyValuePairs(Settings settings, string directory) { ReadOnlyDictionary results; + int id; List? collection; Dictionary> keyValuePairs = new(); ReadOnlyCollection notifications = GetNotifications(settings, directory); foreach (Notification notification in notifications) { - if (!keyValuePairs.TryGetValue(notification.Id, out collection)) + if (!int.TryParse(notification.Id, out id)) + continue; + if (!keyValuePairs.TryGetValue(id, out collection)) { - keyValuePairs.Add(notification.Id, new()); - if (!keyValuePairs.TryGetValue(notification.Id, out collection)) + keyValuePairs.Add(id, new()); + if (!keyValuePairs.TryGetValue(id, out collection)) throw new Exception(); } collection.Add(notification); @@ -185,7 +191,7 @@ public class Aggregation internal static ReadOnlyDictionary GetKeyValuePairs(Settings settings, Notification notification) { ReadOnlyDictionary results; - Dictionary> keyValuePairs = new() { { notification.Id, new Notification[] { notification }.ToList() } }; + Dictionary> keyValuePairs = new() { { int.Parse(notification.Id), new Notification[] { notification }.ToList() } }; results = GetKeyValuePairs(settings, keyValuePairs); return results; } diff --git a/Adaptation/FileHandlers/Priority/FileRead.cs b/Adaptation/FileHandlers/Priority/FileRead.cs index e67bd2e..bfdd966 100644 --- a/Adaptation/FileHandlers/Priority/FileRead.cs +++ b/Adaptation/FileHandlers/Priority/FileRead.cs @@ -6,8 +6,10 @@ using Adaptation.Shared.Methods; using log4net; using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Text.Json; +using System.Threading; namespace Adaptation.FileHandlers.Priority; @@ -16,6 +18,7 @@ namespace Adaptation.FileHandlers.Priority; public class FileRead : Shared.FileRead, IFileRead { + private readonly Timer _Timer; internal static ILog Log => _Log; internal static Settings Settings => _Settings; internal static Dictionary WorkItems => _WorkItems; @@ -49,16 +52,22 @@ public class FileRead : Shared.FileRead, IFileRead sourceFileFilter: _FileConnectorConfiguration.SourceFileFilter, sourceFileLocation: _FileConnectorConfiguration.SourceFileLocation, targetFileLocation: _FileConnectorConfiguration.TargetFileLocation); - string? json = WeightedShortestJobFirstHub.PopulatedWorkItemsAndGetJson(_Settings); - if (!string.IsNullOrEmpty(json)) - WeightedShortestJobFirstHub.WriteJson(json); + _Timer = new Timer(Callback, null, Timeout.Infinite, Timeout.Infinite); string cellInstanceNamed = string.Concat("CellInstance.", _EquipmentType); string url = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, $"{cellInstanceNamed}.Microsoft.Owin.Hosting.WebApp.Start.URL"); if (_IsEAFHosted) { - _ = Microsoft.Owin.Hosting.WebApp.Start(url); + _ = Microsoft.Owin.Hosting.WebApp.Start(url); _Log.Info($"Server running on {url}"); } + if (Debugger.IsAttached || fileConnectorConfiguration.PreProcessingMode == FileConnectorConfiguration.PreProcessingModeEnum.Process) + Callback(null); + else + { + long fileScanningIntervalInSeconds = _FileConnectorConfiguration.FileScanningIntervalInSeconds is null ? 0 : _FileConnectorConfiguration.FileScanningIntervalInSeconds.Value; + TimeSpan timeSpan = new(DateTime.Now.AddSeconds(fileScanningIntervalInSeconds).Ticks - DateTime.Now.Ticks); + _ = _Timer.Change((long)timeSpan.TotalMilliseconds, Timeout.Infinite); + } } void IFileRead.Move(Tuple> extractResults, Exception exception) => Move(extractResults); @@ -138,4 +147,28 @@ public class FileRead : Shared.FileRead, IFileRead return results; } + private void Callback(object? state) + { + try + { + _Log.Info($"Enter-{nameof(WeightedShortestJobFirstModule.PopulatedWorkItemsAndGetJson)}"); + string? json = WeightedShortestJobFirstModule.PopulatedWorkItemsAndGetJson(_Settings); + if (!string.IsNullOrEmpty(json)) + WeightedShortestJobFirstModule.WriteJson(json); + _Log.Info($"End-{nameof(WeightedShortestJobFirstModule.PopulatedWorkItemsAndGetJson)}"); + } + catch (Exception exception) + { + string subject = string.Concat("Exception:", _CellInstanceConnectionName); + string body = string.Concat(exception.Message, Environment.NewLine, Environment.NewLine, exception.StackTrace); + _Log.Fatal($"Exception-{nameof(WeightedShortestJobFirstModule.PopulatedWorkItemsAndGetJson)}{Environment.NewLine}{body}"); + try + { + _SMTP.SendHighPriorityEmailMessage(subject, body); + File.WriteAllText(".email", body); + } + catch (Exception) { } + } + } + } \ No newline at end of file diff --git a/Adaptation/FileHandlers/Priority/Notification.cs b/Adaptation/FileHandlers/Priority/Notification.cs index 7933fc1..2e8d443 100644 --- a/Adaptation/FileHandlers/Priority/Notification.cs +++ b/Adaptation/FileHandlers/Priority/Notification.cs @@ -9,15 +9,14 @@ public class Notification [JsonConstructor] public Notification(int? fibonacci, - int id, + string id, int? inverse, string? machineId, string page, - string? remoteIpAddress, string? site, - long time, + string time, string? username, - int value) + string? value) { int? i = inverse is not null ? inverse : GetInverse(value); Fibonacci = fibonacci is not null ? fibonacci : i is null ? null : GetFibonacci(i.Value); @@ -25,32 +24,30 @@ public class Notification Inverse = i; MachineId = machineId; Page = page; - RemoteIpAddress = remoteIpAddress is not null ? remoteIpAddress : null; Site = site is not null ? site : "MES"; Time = time; Username = username; Value = value; } - [JsonPropertyName("id")] public int Id { get; } + [JsonPropertyName("id")] public string Id { get; } [JsonPropertyName("fibonacci")] public int? Fibonacci { get; } [JsonPropertyName("inverse")] public int? Inverse { get; } [JsonPropertyName("machineId")] public string? MachineId { get; } [JsonPropertyName("page")] public string Page { get; } - [JsonPropertyName("RemoteIpAddress")] public string? RemoteIpAddress { get; } [JsonPropertyName("site")] public string? Site { get; } - [JsonPropertyName("time")] public long Time { get; } + [JsonPropertyName("time")] public string Time { get; } [JsonPropertyName("username")] public string? Username { get; } - [JsonPropertyName("value")] public int Value { get; } + [JsonPropertyName("value")] public string? Value { get; } - internal static int? GetInverse(int value) => + internal static int? GetInverse(string? value) => value switch { - 1 => 5, - 2 => 4, - 3 => 3, - 4 => 2, - 5 => 1, + "1" => 5, + "2" => 4, + "3" => 3, + "4" => 2, + "5" => 1, _ => null }; @@ -69,18 +66,6 @@ public class Notification _ => null }; - internal static Notification GetNotification(Notification notification, string? remoteIpAddress, string? connectionId) => - new(notification.Fibonacci, - notification.Id, - notification.Inverse, - notification.MachineId, - notification.Page, - remoteIpAddress ?? connectionId, - notification.Site, - notification.Time, - notification.Username, - notification.Value); - } [JsonSourceGenerationOptions(WriteIndented = true)] diff --git a/Adaptation/FileHandlers/Priority/Startup.cs b/Adaptation/FileHandlers/Priority/Startup.cs index 5b1757b..3099aaf 100644 --- a/Adaptation/FileHandlers/Priority/Startup.cs +++ b/Adaptation/FileHandlers/Priority/Startup.cs @@ -1,4 +1,5 @@ using Microsoft.Owin.Cors; +using Nancy.Owin; using Owin; public class Startup @@ -7,7 +8,10 @@ public class Startup public void Configuration(IAppBuilder app) { _ = app.UseCors(CorsOptions.AllowAll); + _ = app.UseNancy(); +#if SignalR _ = app.MapSignalR(); +#endif } } \ No newline at end of file diff --git a/Adaptation/FileHandlers/Priority/WeightedShortestJobFirstHub.cs b/Adaptation/FileHandlers/Priority/WeightedShortestJobFirstHub.cs index 5e211e7..c7317ed 100644 --- a/Adaptation/FileHandlers/Priority/WeightedShortestJobFirstHub.cs +++ b/Adaptation/FileHandlers/Priority/WeightedShortestJobFirstHub.cs @@ -1,12 +1,11 @@ +#if SignalR + using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.IO; -using System.Linq; -using System.Text.Json; #nullable enable +#pragma warning disable CA1822 + namespace Adaptation.FileHandlers.Priority; public class WeightedShortestJobFirstHub : Microsoft.AspNet.SignalR.Hub @@ -17,105 +16,22 @@ public class WeightedShortestJobFirstHub : Microsoft.AspNet.SignalR.Hub // await Clients.All.send(n); // } - private string? GetRemoteIpAddress() => - Context?.Headers?.Get("X-Real-IP"); - public void Send(string name, string message) { Console.WriteLine($"{name}:{message};"); - // FileRead.Logger.LogWarning($"{name}:{message};"); - // FileRead.Log?.Info($"{name}:{message};"); Console.WriteLine(Context?.ConnectionId); - // FileRead.Logger.LogWarning(Context?.ConnectionId); - // FileRead.Log?.Info(Context?.ConnectionId); - string? remoteIpAddress = GetRemoteIpAddress(); - Console.WriteLine(remoteIpAddress); - // FileRead.Logger.LogWarning(remoteIpAddress); - // FileRead.Log?.Info(remoteIpAddress); Clients.All.addMessage(name, message); } - private static void FileWriteAllText(Settings settings, Notification n) + public void NotifyAll(Notification notification) { - string json = JsonSerializer.Serialize(n, NotificationSourceGenerationContext.Default.Notification); - string directory = Path.Combine(settings.SourceFileLocation, n.Page, n.Id.ToString()); - if (!Directory.Exists(directory)) - _ = Directory.CreateDirectory(directory); - string checkFile = Path.Combine(directory, $"{n.Time}.json"); - File.WriteAllText(checkFile, json); - } - - internal static void WriteJson(string json) - { - string jsonFile = Path.Combine(FileRead.Settings.ParentDirectory, "{}.json"); - string jsonFileWith = Path.Combine(FileRead.Settings.ParentDirectory, "{[]}.json"); - string jsonOld = File.Exists(jsonFileWith) ? File.ReadAllText(jsonFileWith) : string.Empty; - if (json != jsonOld) + try { - File.WriteAllText(jsonFileWith, json); - Dictionary w = JsonSerializer.Deserialize(json.Replace($"\"{nameof(Aggregation.Notifications)}\":", "\"ignore\":"), WorkItemDictionarySourceGenerationContext.Default.DictionaryInt32WorkItem) ?? throw new Exception(); - json = JsonSerializer.Serialize(w, WorkItemDictionarySourceGenerationContext.Default.DictionaryInt32WorkItem); - File.WriteAllText(jsonFile, json); + WorkItem workItem = GetWorkItem(notification); + Clients.All.updateWorkItem(notification.Page, workItem); } - } - - internal static string? PopulatedWorkItemsAndGetJson(Settings settings) - { - string? result = null; - ReadOnlyDictionary workItems = WorkItem.GetKeyValuePairs(settings); - int useCount = (from l in workItems where l.Value.CostOfDelay is not null select true).Count(); - double prioritySize = useCount / settings.Priorities; - double priorityGroupSize = useCount / settings.PriorityGroups; - WorkItem[] sorted = (from l in workItems - where l.Value is not null - orderby l.Value.Site is not null, - l.Value.Site descending, - l.Value.CostOfDelay is not null, - l.Value.CostOfDelay descending, - l.Value.BusinessValue?.FibonacciAverage is not null, - l.Value.BusinessValue?.FibonacciAverage descending, - l.Key - select l.Value).ToArray(); - lock (FileRead.WorkItems) - { - int j = 0; - WorkItem w; - double value; - int lastId = -1; - int? sortBeforeId; - WorkItem workItem; - int? sortPriority; - int? sortPriorityGroup; - FileRead.WorkItems.Clear(); - for (int i = 0; i < sorted.Length; i++) - { - w = sorted[i]; - if (w.CostOfDelay is null) - { - sortBeforeId = null; - sortPriority = null; - sortPriorityGroup = null; - } - else - { - j += 1; - sortBeforeId = lastId; - value = (j / prioritySize) + 1; - sortPriority = (int)Math.Floor(value); - if (sortPriority > settings.Priorities) - sortPriority = settings.Priorities; - value = (j / priorityGroupSize) + 1; - sortPriorityGroup = (int)Math.Floor(value); - if (sortPriorityGroup > settings.PriorityGroups) - sortPriorityGroup = settings.PriorityGroups; - } - workItem = WorkItem.GetWorkItem(w, i, sortBeforeId, sortPriority, sortPriorityGroup); - FileRead.WorkItems.Add(workItem.Id, workItem); - lastId = w.Id; - } - result = JsonSerializer.Serialize(FileRead.WorkItems, WorkItemDictionarySourceGenerationContext.Default.DictionaryInt32WorkItem); - } - return result; + catch (Exception ex) + { Console.WriteLine($"{ex.Message}{Environment.NewLine}{ex.StackTrace}"); } } private static WorkItem GetWorkItem(Notification notification) @@ -129,30 +45,6 @@ public class WeightedShortestJobFirstHub : Microsoft.AspNet.SignalR.Hub return result; } - public void NotifyAll(Notification notification) - { - try - { - string? json = null; - string? remoteIpAddress = GetRemoteIpAddress(); - Notification n = Notification.GetNotification(notification, remoteIpAddress, Context?.ConnectionId); - Console.WriteLine(n.ToString()); - // FileRead.Logger.LogWarning(n.ToString()); - // FileRead.Log?.Info(n.ToString()); - FileWriteAllText(FileRead.Settings, n); - json = PopulatedWorkItemsAndGetJson(FileRead.Settings); - if (!string.IsNullOrEmpty(json)) - WriteJson(json); - if (!string.IsNullOrEmpty(n.RemoteIpAddress)) - { - WorkItem workItem = GetWorkItem(n); - Clients.All.updateWorkItem(n.Page, workItem); - } - } - catch (Exception ex) - { Console.WriteLine($"{ex.Message}{Environment.NewLine}{ex.StackTrace}"); } - // { FileRead.Logger.LogError(ex, "Error!"); } - // { FileRead.Log?.Error("Error!", ex); } - } +} -} \ No newline at end of file +#endif \ No newline at end of file diff --git a/Adaptation/FileHandlers/Priority/WeightedShortestJobFirstModule.cs b/Adaptation/FileHandlers/Priority/WeightedShortestJobFirstModule.cs new file mode 100644 index 0000000..7225a6f --- /dev/null +++ b/Adaptation/FileHandlers/Priority/WeightedShortestJobFirstModule.cs @@ -0,0 +1,155 @@ +using log4net; +using Nancy; +using Nancy.Extensions; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Text.Json; + +#nullable enable + +#pragma warning disable CA1822 + +namespace Adaptation.FileHandlers.Priority; + +public class WeightedShortestJobFirstModule : NancyModule +{ + + public WeightedShortestJobFirstModule() + { + Get("/api/v1/ado/", _ => + { + ILog log = LogManager.GetLogger(typeof(WeightedShortestJobFirstModule)); + log.Info($"{nameof(Get)}"); + return "Hello"; + }); + base.Post("/api/v1/ado/", _ => + { + Notification notification; + ILog log = LogManager.GetLogger(typeof(WeightedShortestJobFirstModule)); + log.Info($"Enter-{nameof(Post)}"); + try + { + string body = Request.Body.AsString(); + DynamicDictionary form = Request.Form; + Dictionary keyValuePairs = form.ToDictionary(); + notification = GetNotification(body, keyValuePairs); + } + catch (Exception ex) + { + log.Fatal($"Exception-{nameof(Post)}{Environment.NewLine}{ex.Message}{Environment.NewLine}{Environment.NewLine}{ex.StackTrace}"); + throw; + } + log.Info($"Return-{nameof(Post)}"); + return notification.Time.ToString(); + }); + } + + internal static Notification GetNotification(string body, Dictionary keyValuePairs) + { + string? json; + Notification notification; + if (!string.IsNullOrEmpty(body) && body[0] == '{') + { + File.WriteAllText(".json", body); + notification = JsonSerializer.Deserialize(body, NotificationSourceGenerationContext.Default.Notification) ?? throw new NullReferenceException(); + } + else + { + json = JsonSerializer.Serialize(keyValuePairs); + File.WriteAllText(".json", json); + notification = JsonSerializer.Deserialize(json, NotificationSourceGenerationContext.Default.Notification) ?? throw new NullReferenceException(); + } + FileWriteAllText(FileRead.Settings, notification); + json = PopulatedWorkItemsAndGetJson(FileRead.Settings); + if (!string.IsNullOrEmpty(json)) + WriteJson(json); + return notification; + } + + private static void FileWriteAllText(Settings settings, Notification notification) + { + string json = JsonSerializer.Serialize(notification, NotificationSourceGenerationContext.Default.Notification); + string directory = Path.Combine(settings.SourceFileLocation, notification.Page, notification.Id.ToString()); + if (!Directory.Exists(directory)) + _ = Directory.CreateDirectory(directory); + string checkFile = Path.Combine(directory, $"{notification.Time}.json"); + File.WriteAllText(checkFile, json); + } + + internal static string? PopulatedWorkItemsAndGetJson(Settings settings) + { + string? result = null; + ReadOnlyDictionary workItems = WorkItem.GetKeyValuePairs(settings); + int useCount = (from l in workItems where l.Value.CostOfDelay is not null select true).Count(); + double prioritySize = useCount / settings.Priorities; + double priorityGroupSize = useCount / settings.PriorityGroups; + WorkItem[] sorted = (from l in workItems + where l.Value is not null + orderby l.Value.Site is not null, + l.Value.Site descending, + l.Value.CostOfDelay is not null, + l.Value.CostOfDelay descending, + l.Value.BusinessValue?.FibonacciAverage is not null, + l.Value.BusinessValue?.FibonacciAverage descending, + l.Key + select l.Value).ToArray(); + lock (FileRead.WorkItems) + { + int j = 0; + WorkItem w; + double value; + int lastId = -1; + int? sortBeforeId; + WorkItem workItem; + int? sortPriority; + int? sortPriorityGroup; + FileRead.WorkItems.Clear(); + for (int i = 0; i < sorted.Length; i++) + { + w = sorted[i]; + if (w.CostOfDelay is null) + { + sortBeforeId = null; + sortPriority = null; + sortPriorityGroup = null; + } + else + { + j += 1; + sortBeforeId = lastId; + value = (j / prioritySize) + 1; + sortPriority = (int)Math.Floor(value); + if (sortPriority > settings.Priorities) + sortPriority = settings.Priorities; + value = (j / priorityGroupSize) + 1; + sortPriorityGroup = (int)Math.Floor(value); + if (sortPriorityGroup > settings.PriorityGroups) + sortPriorityGroup = settings.PriorityGroups; + } + workItem = WorkItem.GetWorkItem(w, i, sortBeforeId, sortPriority, sortPriorityGroup); + FileRead.WorkItems.Add(workItem.Id, workItem); + lastId = w.Id; + } + result = JsonSerializer.Serialize(FileRead.WorkItems, WorkItemDictionarySourceGenerationContext.Default.DictionaryInt32WorkItem); + } + return result; + } + + internal static void WriteJson(string json) + { + string jsonFile = Path.Combine(FileRead.Settings.ParentDirectory, "{}.json"); + string jsonFileWith = Path.Combine(FileRead.Settings.ParentDirectory, "{[]}.json"); + string jsonOld = File.Exists(jsonFileWith) ? File.ReadAllText(jsonFileWith) : string.Empty; + if (json != jsonOld) + { + File.WriteAllText(jsonFileWith, json); + Dictionary w = JsonSerializer.Deserialize(json.Replace($"\"{nameof(Aggregation.Notifications)}\":", "\"ignore\":"), WorkItemDictionarySourceGenerationContext.Default.DictionaryInt32WorkItem) ?? throw new Exception(); + json = JsonSerializer.Serialize(w, WorkItemDictionarySourceGenerationContext.Default.DictionaryInt32WorkItem); + File.WriteAllText(jsonFile, json); + } + } + +} \ No newline at end of file diff --git a/Adaptation/FileHandlers/Processed/FileRead.cs b/Adaptation/FileHandlers/Processed/FileRead.cs index 8e06842..aaca0c1 100644 --- a/Adaptation/FileHandlers/Processed/FileRead.cs +++ b/Adaptation/FileHandlers/Processed/FileRead.cs @@ -140,6 +140,26 @@ public class FileRead : Shared.FileRead, IFileRead // File.WriteAllText(jsonFileName, json); } + private static void MoveMatchingFile(string jobIdDirectory, string matchDirectory) + { + string checkFile; + string[] jobIdDirectoryFiles = Directory.GetFiles(jobIdDirectory, "*", SearchOption.TopDirectoryOnly); + string[] matchDirectoryFiles = Directory.GetFiles(matchDirectory, "*", SearchOption.TopDirectoryOnly); + foreach (string jobIdDirectoryFile in jobIdDirectoryFiles) + { + foreach (string matchDirectoryFile in matchDirectoryFiles) + { + if (jobIdDirectoryFile.StartsWith(matchDirectoryFile)) + { + checkFile = Path.Combine(matchDirectory, Path.GetFileName(matchDirectoryFile)); + if (File.Exists(checkFile)) + continue; + File.Move(jobIdDirectoryFile, checkFile); + } + } + } + } + private Tuple> GetExtractResult(string reportFullPath, DateTime dateTime) { Tuple> results; diff --git a/Adaptation/FileHandlers/json/StaticSite/html/122508.html b/Adaptation/FileHandlers/json/StaticSite/html/122508.html index 87af59e..5cf53b9 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/122508.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/122508.html @@ -6,15 +6,15 @@ Infineon - 122508 - Feature iteration should be set to max of children - - + + - - - - - - + + + + + + @@ -56,7 +56,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/html/122514.html b/Adaptation/FileHandlers/json/StaticSite/html/122514.html index 1338864..4666a31 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/122514.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/122514.html @@ -6,15 +6,15 @@ Infineon - 122514 - Features and children must have a Tag - - + + - - - - - - + + + + + + @@ -56,7 +56,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/html/122517.html b/Adaptation/FileHandlers/json/StaticSite/html/122517.html index 36874bb..edd272b 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/122517.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/122517.html @@ -6,15 +6,15 @@ Infineon - 122517 - Feature start date should be min activated date of children - - + + - - - - - - + + + + + + @@ -56,7 +56,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/html/123066.html b/Adaptation/FileHandlers/json/StaticSite/html/123066.html index c8fedeb..7fb3ac8 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/123066.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/123066.html @@ -6,15 +6,15 @@ Infineon - 123066 - When children of a Feature are not New Feature must also not be New - - + + - - - - - - + + + + + + @@ -56,7 +56,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/html/123067.html b/Adaptation/FileHandlers/json/StaticSite/html/123067.html index df5c5a9..8a4cd34 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/123067.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/123067.html @@ -6,15 +6,15 @@ Infineon - 123067 - WIP - - + + - - - - - - + + + + + + @@ -56,7 +56,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/html/126169.html b/Adaptation/FileHandlers/json/StaticSite/html/126169.html index dd25ca2..209ad05 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/126169.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/126169.html @@ -6,15 +6,15 @@ Infineon - 126169 - Children of a Feature should have the same priority - - + + - - - - - - + + + + + + @@ -56,7 +56,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/html/business.html b/Adaptation/FileHandlers/json/StaticSite/html/business.html index 4b79abc..93a16d2 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/business.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/business.html @@ -6,15 +6,15 @@ Infineon - Business Value - - + + - - - - - - + + + + + + @@ -59,7 +59,7 @@ What is the relative value to the Customer or business? diff --git a/Adaptation/FileHandlers/json/StaticSite/html/cod-b.html b/Adaptation/FileHandlers/json/StaticSite/html/cod-b.html index a4d4e3d..f5467d4 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/cod-b.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/cod-b.html @@ -10,7 +10,7 @@ - + @@ -54,51 +54,52 @@ - - - - - - - - - - - -
- -
-
-
- -
  - -
-
-
-
- - - - - \ No newline at end of file diff --git a/Adaptation/FileHandlers/json/StaticSite/html/effort.html b/Adaptation/FileHandlers/json/StaticSite/html/effort.html index 46c4979..0dc4926 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/effort.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/effort.html @@ -6,15 +6,15 @@ Infineon - Effort - - + + - - - - - - + + + + + + @@ -55,7 +55,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/html/risk.html b/Adaptation/FileHandlers/json/StaticSite/html/risk.html index b886a46..22f3815 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/risk.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/risk.html @@ -6,15 +6,15 @@ Infineon - Risk Reduction and/or Opportunity Enablement - - + + - - - - - - + + + + + + @@ -59,7 +59,7 @@ What else does this do for our business? diff --git a/Adaptation/FileHandlers/json/StaticSite/html/wsjf-c.html b/Adaptation/FileHandlers/json/StaticSite/html/simple.html similarity index 93% rename from Adaptation/FileHandlers/json/StaticSite/html/wsjf-c.html rename to Adaptation/FileHandlers/json/StaticSite/html/simple.html index b0c307d..9750bc9 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/wsjf-c.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/simple.html @@ -21,7 +21,7 @@ - + - - - - - + + + + + + @@ -59,7 +59,7 @@ How does user/business value decay over time? diff --git a/Adaptation/FileHandlers/json/StaticSite/html/with-parents.html b/Adaptation/FileHandlers/json/StaticSite/html/with-parents.html index 4c1bad2..112bd54 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/with-parents.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/with-parents.html @@ -6,15 +6,15 @@ Infineon - User Stor(ies) with parents - - + + - - - - - - + + + + + + @@ -55,7 +55,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/html/wsjf-b.html b/Adaptation/FileHandlers/json/StaticSite/html/wsjf-b.html index 016c35c..a0e23e2 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/wsjf-b.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/wsjf-b.html @@ -6,15 +6,15 @@ Infineon - Result of Weightest Shortest Job First calculation (see @SCALE formula) - - + + - - - - - - + + + + + + @@ -55,7 +55,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/html/wsjf.html b/Adaptation/FileHandlers/json/StaticSite/html/wsjf.html index 1066ade..9c760e2 100644 --- a/Adaptation/FileHandlers/json/StaticSite/html/wsjf.html +++ b/Adaptation/FileHandlers/json/StaticSite/html/wsjf.html @@ -6,15 +6,15 @@ Infineon - Result of Weightest Shortest Job First calculation (see @SCALE formula) - - + + - - - - - - + + + + + + @@ -55,7 +55,7 @@ diff --git a/Adaptation/FileHandlers/json/StaticSite/js/cod-b.js b/Adaptation/FileHandlers/json/StaticSite/js/cod-b.js index 8df1e1c..2acdb43 100644 --- a/Adaptation/FileHandlers/json/StaticSite/js/cod-b.js +++ b/Adaptation/FileHandlers/json/StaticSite/js/cod-b.js @@ -67,23 +67,24 @@ function getNotifications(x, aggregation) { else { result = ''; aggregation.Notifications.forEach(element => { + const username = element.username == null ? 'user' : element.username; if (element.value === 1) { - result += 'Highest ' + element.RemoteIpAddress + '|'; + result += 'Highest ' + username + '|'; } else if (element.value === 2) { - result += 'High ' + element.RemoteIpAddress + '|'; + result += 'High ' + username + '|'; } else if (element.value === 3) { - result += 'Medium ' + element.RemoteIpAddress + '|'; + result += 'Medium ' + username + '|'; } else if (element.value === 4) { - result += 'Low ' + element.RemoteIpAddress + '|'; + result += 'Low ' + username + '|'; } else if (element.value === 5) { - result += 'Lowest ' + element.RemoteIpAddress + '|'; + result += 'Lowest ' + username + '|'; } else { - result += element.value + ' ' + element.RemoteIpAddress + '|'; + result += element.value + ' ' + username + '|'; } }); result = result.substring(0, result.length - 1); @@ -191,32 +192,32 @@ function sendValue(fromHtml, element, page, id) { if (fromHtml && notification.value !== "9") { $("#AllTextarea").hide(); document.getElementById('AllTextarea').value = ''; - // $.post(_apiUrl + "save", notification) - // .done(function (msg) { - // console.log("Posted value of " + notification.value + " for " + id + " on page " + page + " " + msg); - // }) - // .fail(function (_, textStatus, _) { - // alert(textStatus); - // }); - if (!_connectionHubStartDone) { - alert("Error data not sent!"); - } - else { - if (_chat.connection.lastError != undefined) - alert("Last Error:\r\n\r\n" + _chat.connection.lastError); - _chat.server.notifyAll(notification) - .done(function () { - console.log("Posted value of " + notification.value + " for " + id + " on page " + page); - }) - .fail(function (errorThrown) { - if (errorThrown == undefined || errorThrown.message == undefined || errorThrown.stack == undefined) { - alert("Error posting!"); - } - else { - alert(errorThrown.message + "\r\n\r\n" + errorThrown.stack); - } - }); - } + $.post(_apiUrl, notification) + .done(function (msg) { + console.log("Posted value of " + notification.value + " for " + id + " on page " + page + " " + msg); + if (!_connectionHubStartDone) { + console.warn("Error data not sent!"); + } + else { + if (_chat.connection.lastError != undefined) + console.warn("Last Error:\r\n\r\n" + _chat.connection.lastError); + _chat.server.notifyAll(notification) + .done(function () { + console.log("Posted value of " + notification.value + " for " + id + " on page " + page); + }) + .fail(function (errorThrown) { + if (errorThrown == undefined || errorThrown.message == undefined || errorThrown.stack == undefined) { + console.warn("Error posting!"); + } + else { + console.warn(errorThrown.message + "\r\n\r\n" + errorThrown.stack); + } + }); + } + }) + .fail(function (_, textStatus, _) { + console.warn(textStatus); + }); } } @@ -391,7 +392,7 @@ function updateWorkItem(b, r, t, c, e, w, page, workItem) { aggregation = workItem.Effort; } if (x == undefined) - alert("Error with page!"); + console.warn("Error with page!"); else { $('#' + x.page + workItem.Id).text('!' + myRound(aggregation.FibonacciAverage, 100)); if (workItem.WeightedShortestJobFirst != undefined) { @@ -447,7 +448,7 @@ function setupSignalR(b, r, t, c, e, w, signalRUrl) { $.connection.hub.url = signalRUrl; _chat = $.connection.weightedShortestJobFirstHub; if (_chat == undefined || _chat.server == undefined) { - alert('Error within handshake!'); + console.warn('Error within handshake!'); } else { _chat.client.updateWorkItem = function (page, workItem) { @@ -461,10 +462,10 @@ function setupSignalR(b, r, t, c, e, w, signalRUrl) { .fail(function (errorThrown) { _connectionHubStartDone = false; if (errorThrown == undefined || errorThrown.message == undefined || errorThrown.stack == undefined) { - alert("Error starting conection!"); + console.warn("Error starting connection!"); } else { - alert(errorThrown.message + "\r\n" + errorThrown.stack); + console.warn(errorThrown.message + "\r\n" + errorThrown.stack); } }); } @@ -17061,8 +17062,8 @@ if (typeof document == 'undefined') { const apiUrl = "https://eaf-dev.mes.infineon.com/api/v1/ado/"; const windowLocationHRef = "https://eaf-dev.mes.infineon.com/html/cod.html?site=MES"; const workItems = { - a: "https://eaf-dev.mes.infineon.com/markdown/bugs-features-with-parents.json?v=2025-01-22-10-49", - b: "https://eaf-dev.mes.infineon.com/markdown/{}.json?v=2025-01-22-10-49" + a: "https://eaf-dev.mes.infineon.com/markdown/bugs-features-with-parents.json?v=2025-04-10-15-59", + b: "https://eaf-dev.mes.infineon.com/markdown/{}.json?v=2025-04-10-15-59" }; const b = { page: "business", diff --git a/Adaptation/FileHandlers/json/StaticSite/js/wsjf-c.js b/Adaptation/FileHandlers/json/StaticSite/js/simple.js similarity index 90% rename from Adaptation/FileHandlers/json/StaticSite/js/wsjf-c.js rename to Adaptation/FileHandlers/json/StaticSite/js/simple.js index 0bf2aa7..b26f6cd 100644 --- a/Adaptation/FileHandlers/json/StaticSite/js/wsjf-c.js +++ b/Adaptation/FileHandlers/json/StaticSite/js/simple.js @@ -31,11 +31,9 @@ function initIndex(url, apiUrl) { // Call the Send method on the hub. // chat.server.send($('#displayname').val(), $('#message').val()); var notification = { - "Json": null, "id": 110743, "page": "effort", - "QueryString": "time=1737573418926\u0026id=110743\u0026page=effort\u0026value=1", - "RemoteIpAddress": "10.95.36.87", + "username": "user", "time": 1737573418926, "value": 1 }; diff --git a/Adaptation/MESAFIBACKLOG.Tests.csproj b/Adaptation/MESAFIBACKLOG.Tests.csproj index 0d55b25..649bb91 100644 --- a/Adaptation/MESAFIBACKLOG.Tests.csproj +++ b/Adaptation/MESAFIBACKLOG.Tests.csproj @@ -106,6 +106,7 @@ + diff --git a/Adaptation/Shared/FileRead.cs b/Adaptation/Shared/FileRead.cs index 7c2fe14..2bf54ea 100644 --- a/Adaptation/Shared/FileRead.cs +++ b/Adaptation/Shared/FileRead.cs @@ -383,7 +383,7 @@ public class FileRead : Properties.IFileRead else { string logisticsSequence = _Logistics.Sequence.ToString(); - results = Directory.GetDirectories(jobIdDirectory, string.Concat(_Logistics.MID, '*', logisticsSequence, '*'), SearchOption.TopDirectoryOnly); + results = Directory.GetDirectories(jobIdDirectory, $"*{logisticsSequence}*", SearchOption.TopDirectoryOnly); } if ((results is null) || results.Length != 1) throw new Exception("Didn't find directory by logistics sequence"); diff --git a/Adaptation/Shared/ProcessDataStandardFormat.cs b/Adaptation/Shared/ProcessDataStandardFormat.cs index a066f50..059d613 100644 --- a/Adaptation/Shared/ProcessDataStandardFormat.cs +++ b/Adaptation/Shared/ProcessDataStandardFormat.cs @@ -28,14 +28,17 @@ internal class ProcessDataStandardFormat internal ReadOnlyCollection Body { get; private set; } internal ReadOnlyCollection Columns { get; private set; } internal ReadOnlyCollection Logistics { get; private set; } + internal ReadOnlyCollection InputLines { get; private set; } internal ProcessDataStandardFormat(ReadOnlyCollection body, ReadOnlyCollection columns, + ReadOnlyCollection inputLines, ReadOnlyCollection logistics, long? sequence) { Body = body; Columns = columns; + InputLines = inputLines; Logistics = logistics; Sequence = sequence; } @@ -53,7 +56,7 @@ internal class ProcessDataStandardFormat GetString(SearchFor.Archive, addSpaces, separator); internal static ProcessDataStandardFormat GetEmpty() => - new(new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), null); + new(new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), new(Array.Empty()), null); internal static List PDSFToFixedWidth(string reportFullPath) { @@ -169,14 +172,20 @@ internal class ProcessDataStandardFormat { for (int i = r; i < lines.Length; i++) { - if (lines[r].StartsWith("END_HEADER")) + if (!lines[i].StartsWith("LOGISTICS_") || lines[i].StartsWith("END_HEADER")) break; logistics.Add(lines[i]); } break; } } - result = new(logistics.AsReadOnly(), columns.AsReadOnly(), body.AsReadOnly(), null); + if (lines.Length > 0 && body.Count == 0 && columns.Count == 0 && logistics.Count == 0) + logistics.Add(lines[1]); + result = new(body: body.AsReadOnly(), + columns: columns.AsReadOnly(), + inputLines: lines.ToList().AsReadOnly(), + logistics: logistics.AsReadOnly(), + sequence: null); return result; } @@ -229,7 +238,7 @@ internal class ProcessDataStandardFormat { for (int i = r; i < lines.Length; i++) { - if (lines[r].StartsWith("END_HEADER")) + if (!lines[i].StartsWith("LOGISTICS_") || lines[i].StartsWith("END_HEADER")) break; logistics.Add(lines[i]); } @@ -245,6 +254,7 @@ internal class ProcessDataStandardFormat } result = new(body: body.AsReadOnly(), columns: new(columns), + inputLines: lines.ToList().AsReadOnly(), logistics: logistics.AsReadOnly(), sequence: sequence); return result; @@ -335,7 +345,8 @@ internal class ProcessDataStandardFormat results.Add(string.Join("\t", values)); } result = new(body: new(results), - columns: processDataStandardFormat.Columns, + columns: processDataStandardFormatMapping.OldColumnNames, + inputLines: processDataStandardFormat.InputLines, logistics: processDataStandardFormat.Logistics, sequence: processDataStandardFormat.Sequence); return result; @@ -357,7 +368,7 @@ internal class ProcessDataStandardFormat results.Add($"HEADER_OFFSET\t{headerOffset}"); results.Add($"DATA_OFFSET\t{dataOffset}"); results.Add($"END_OFFSET\t{endOffset}"); - results.Add($"\"{string.Join("\",\t\"", processDataStandardFormat.Columns)}\""); + results.Add($"\"{string.Join("\"\t\"", processDataStandardFormat.Columns)}\""); results.AddRange(processDataStandardFormat.Body); results.Add($"NUM_DATA_ROWS\t{processDataStandardFormat.Body.Count.ToString().PadLeft(9, '0')}"); results.Add($"NUM_DATA_COLUMNS\t{processDataStandardFormat.Columns.Count.ToString().PadLeft(9, '0')}"); @@ -367,6 +378,8 @@ internal class ProcessDataStandardFormat results.Add("LOGISTICS_COLUMN\tA_LOGISTICS"); results.Add("LOGISTICS_COLUMN\tB_LOGISTICS"); results.AddRange(processDataStandardFormat.Logistics); + results.Add("EOF"); + results.AddRange(processDataStandardFormat.InputLines.Select(l => l.Replace('\t', '|'))); File.WriteAllText(path, string.Join(Environment.NewLine, results)); } diff --git a/Adaptation/_Tests/Extract/Development/v2.59.0/MESAFIBACKLOG.cs b/Adaptation/_Tests/Extract/Development/v2.59.0/MESAFIBACKLOG.cs index 0bf095b..b52be33 100644 --- a/Adaptation/_Tests/Extract/Development/v2.59.0/MESAFIBACKLOG.cs +++ b/Adaptation/_Tests/Extract/Development/v2.59.0/MESAFIBACKLOG.cs @@ -1,6 +1,5 @@ #if true using Adaptation.FileHandlers.json.WorkItems; -using Adaptation.FileHandlers.Priority; using Adaptation.Shared; using Adaptation.Shared.Methods; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -190,18 +189,6 @@ public class MESAFIBACKLOG Assert.IsFalse(string.IsNullOrEmpty(extractResult?.Item1)); Assert.IsNotNull(extractResult.Item3); Assert.IsNotNull(extractResult.Item4); - WeightedShortestJobFirstHub weightedShortestJobFirstHub = new(); - Notification notification = new(fibonacci: null, - id: 1107438888, - inverse: null, - machineId: Environment.MachineName, - page: "effort", - remoteIpAddress: "10.95.36.87", - site: "MES", - time: 1737573418926, - username: Environment.UserName, - value: 1); - weightedShortestJobFirstHub.NotifyAll(notification); NonThrowTryCatch(); } diff --git a/MESAFIBACKLOG.csproj b/MESAFIBACKLOG.csproj index 1f49220..da6c813 100644 --- a/MESAFIBACKLOG.csproj +++ b/MESAFIBACKLOG.csproj @@ -154,6 +154,7 @@ + @@ -214,32 +215,14 @@ 0.15.1 - 2.58.0 + 2.59.0 - - 2.4.3 - - - 2.4.3 + + 2.0.0 1.0.0 - - 2.1.0 - - - 2.1.0 - - - 2.1.0 - - - 2.1.0 - - - 16.205.1 - 8.0.3