Compare commits
	
		
			6 Commits
		
	
	
		
			823a31e48a
			...
			master
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5c2a3c97e9 | |||
| e6533e152f | |||
| 19b54a7cc8 | |||
| 43024c6c30 | |||
| e3910d700f | |||
| e651c2804c | 
| @ -110,7 +110,7 @@ dotnet_diagnostic.CA2254.severity = none # CA2254: The logging message template | ||||
| dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name | ||||
| dotnet_diagnostic.IDE0002.severity = warning # Simplify (member access) - System.Version.Equals("1", "2"); Version.Equals("1", "2"); | ||||
| dotnet_diagnostic.IDE0004.severity = warning # IDE0004: Cast is redundant. | ||||
| dotnet_diagnostic.IDE0005.severity = warning # Using directive is unnecessary | ||||
| dotnet_diagnostic.IDE0005.severity = none # Using directive is unnecessary | ||||
| dotnet_diagnostic.IDE0028.severity = none # IDE0028: Collection initialization can be simplified | ||||
| dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031) | ||||
| dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed | ||||
| @ -122,6 +122,7 @@ dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]cs | ||||
| dotnet_diagnostic.IDE0300.severity = none # IDE0300: Collection initialization can be simplified | ||||
| dotnet_diagnostic.IDE0301.severity = none #IDE0301: Collection initialization can be simplified | ||||
| dotnet_diagnostic.IDE0305.severity = none # IDE0305: Collection initialization can be simplified | ||||
| dotnet_diagnostic.MSTEST0015.severity = none # MSTEST0015: Test method {method} should not be ignored | ||||
| dotnet_diagnostic.MSTEST0037.severity = error # MSTEST0037: Use proper 'Assert' methods | ||||
| dotnet_diagnostic.SYSLIB1045.severity = none # SYSLIB1045: diagnostics for regex source generation | ||||
| dotnet_naming_rule.abstract_method_should_be_pascal_case.severity = warning | ||||
|  | ||||
							
								
								
									
										2
									
								
								Adaptation/.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								Adaptation/.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							| @ -4,7 +4,7 @@ | ||||
|       "name": ".NET Core Attach", | ||||
|       "type": "coreclr", | ||||
|       "request": "attach", | ||||
|       "processId": 8912 | ||||
|       "processId": 13604 | ||||
|     } | ||||
|   ] | ||||
| } | ||||
|  | ||||
							
								
								
									
										3
									
								
								Adaptation/.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								Adaptation/.vscode/settings.json
									
									
									
									
										vendored
									
									
								
							| @ -7,6 +7,7 @@ | ||||
|         "CASS", | ||||
|         "CEPIEPSILON", | ||||
|         "CUST", | ||||
|         "DDUPSFS", | ||||
|         "DDUPSP", | ||||
|         "EQPT", | ||||
|         "GETJOBS", | ||||
| @ -31,6 +32,8 @@ | ||||
|         "substr", | ||||
|         "SUSCEPTOR", | ||||
|         "targ", | ||||
|         "TENCOR", | ||||
|         "THFTIRQS", | ||||
|         "TIBCO", | ||||
|         "Wafr" | ||||
|     ], | ||||
|  | ||||
							
								
								
									
										133
									
								
								Adaptation/.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										133
									
								
								Adaptation/.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							| @ -1,19 +1,134 @@ | ||||
| { | ||||
|     "version": "2.0.0", | ||||
|     "inputs": [ | ||||
|         { | ||||
|             "default": "Development", | ||||
|             "description": "Which ASP Net Core Environment?", | ||||
|             "id": "ASPNETCORE_ENVIRONMENT", | ||||
|             "options": [ | ||||
|                 "Development", | ||||
|                 "Production" | ||||
|             ], | ||||
|             "type": "pickString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "{AssemblyTitle}", | ||||
|             "description": "What Assembly Title?", | ||||
|             "id": "AssemblyTitle", | ||||
|             "type": "promptString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "{Build.BuildId}", | ||||
|             "description": "Which Build BuildId?", | ||||
|             "id": "Build.BuildId", | ||||
|             "type": "promptString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "{Build.Reason}", | ||||
|             "description": "Which Build Reason?", | ||||
|             "id": "Build.Reason", | ||||
|             "type": "promptString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "{Build.Repository.Id}", | ||||
|             "description": "Which Build Repository Id?", | ||||
|             "id": "Build.Repository.Id", | ||||
|             "type": "promptString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "{Build.Repository.Name}", | ||||
|             "description": "Which Build Repository Name?", | ||||
|             "id": "Build.Repository.Name", | ||||
|             "type": "promptString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "{Build.SourceVersion}", | ||||
|             "description": "Which Build Source Version?", | ||||
|             "id": "Build.SourceVersion", | ||||
|             "type": "promptString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "Debug", | ||||
|             "description": "Which Configuration?", | ||||
|             "id": "Configuration", | ||||
|             "options": [ | ||||
|                 "Debug", | ||||
|                 "Release" | ||||
|             ], | ||||
|             "type": "pickString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "net8.0", | ||||
|             "description": "Which Core Version?", | ||||
|             "id": "CoreVersion", | ||||
|             "options": [ | ||||
|                 "net8.0" | ||||
|             ], | ||||
|             "type": "pickString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/MSBuild/Current/Bin/MSBuild.exe", | ||||
|             "description": "Which MS Build?", | ||||
|             "id": "MSBuild", | ||||
|             "type": "promptString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "https://artifactory.intra.infineon.com/artifactory/api/nuget/ngt-fi-package-main-vir/", | ||||
|             "description": "Which Nuget Source?", | ||||
|             "id": "NugetSource", | ||||
|             "type": "promptString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "win-x64", | ||||
|             "description": "Which Runtime?", | ||||
|             "id": "Runtime", | ||||
|             "options": [ | ||||
|                 "win-x64", | ||||
|                 "win-x32", | ||||
|                 "linux-x64", | ||||
|                 "linux-x32" | ||||
|             ], | ||||
|             "type": "pickString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "L:/", | ||||
|             "description": "Which System DefaultWorkingDirectory?", | ||||
|             "id": "System.DefaultWorkingDirectory", | ||||
|             "options": [ | ||||
|                 "L:/", | ||||
|                 "D:/", | ||||
|                 "C:/" | ||||
|             ], | ||||
|             "type": "pickString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "v4.8", | ||||
|             "description": "Which Core Target Framework Version?", | ||||
|             "id": "TargetFrameworkVersion", | ||||
|             "options": [ | ||||
|                 "v4.8" | ||||
|             ], | ||||
|             "type": "pickString" | ||||
|         }, | ||||
|         { | ||||
|             "default": "{UserSecretsId}", | ||||
|             "description": "Which Core User Secrets Id?", | ||||
|             "id": "UserSecretsId", | ||||
|             "type": "promptString" | ||||
|         } | ||||
|     ], | ||||
|     "tasks": [ | ||||
|         { | ||||
|             "label": "Build", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
|                 "build", | ||||
|                 "/property:GenerateFullPaths=true", | ||||
|                 "/consoleloggerparameters:NoSummary" | ||||
|                 "build" | ||||
|             ], | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "Test-Debug", | ||||
|             "label": "Test Debug", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
| @ -24,7 +139,7 @@ | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "Test-Release", | ||||
|             "label": "Test Release", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
| @ -50,7 +165,7 @@ | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "Format-Whitespaces", | ||||
|             "label": "Format Whitespaces", | ||||
|             "command": "dotnet", | ||||
|             "type": "process", | ||||
|             "args": [ | ||||
| @ -87,13 +202,13 @@ | ||||
|             "problemMatcher": "$msCompile" | ||||
|         }, | ||||
|         { | ||||
|             "label": "Project", | ||||
|             "label": "Code Project", | ||||
|             "type": "shell", | ||||
|             "command": "code ../MET08DDUPSP1TBI.csproj", | ||||
|             "problemMatcher": [] | ||||
|         }, | ||||
|         { | ||||
|             "label": "Readme", | ||||
|             "label": "Code Read Me", | ||||
|             "type": "shell", | ||||
|             "command": "code ../README.md", | ||||
|             "problemMatcher": [] | ||||
| @ -113,7 +228,7 @@ | ||||
|             "problemMatcher": [] | ||||
|         }, | ||||
|         { | ||||
|             "label": "Git Config", | ||||
|             "label": "Code Git Config", | ||||
|             "type": "shell", | ||||
|             "command": "code ../.git/config", | ||||
|             "problemMatcher": [] | ||||
|  | ||||
| @ -128,7 +128,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             FileCopy(reportFullPath, dateTime, descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -153,7 +153,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             MoveArchive(reportFullPath, dateTime); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -8,6 +8,7 @@ using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.IQSSi; | ||||
| @ -109,6 +110,59 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private static Tuple<string, string> GetLines(Logistics logistics, List<txt.Description> descriptions) | ||||
|     { | ||||
|         StringBuilder result = new(); | ||||
|         char del = '\t'; | ||||
|         txt.Description x = descriptions[0]; | ||||
|         _ = result.Append(x.DcnLpdMin).Append(del).    // 001 -  | ||||
|             Append(x.DcnLpdMax).Append(del).       // 002 -  | ||||
|             Append(x.DcnLpdMean).Append(del).      // 003 - DCN LPD | ||||
|             Append(x.DcnAreaCountMin).Append(del). // 004 -  | ||||
|             Append(x.DcnAreaCountMax).Append(del). // 005 -  | ||||
|             Append(x.DcnAreaCountMean).Append(del).// 006 - DCN Area | ||||
|             Append(x.DcnAreaMin).Append(del).      // 007 -  | ||||
|             Append(x.DcnAreaMax).Append(del).      // 008 -  | ||||
|             Append(x.Date).Append(del).            // 009 -  | ||||
|             Append(x.DcnHazeAvgMean).Append(del).  // 010 - Haze Average | ||||
|             Append(string.Empty).Append(del).              // 011 -  | ||||
|             Append(string.Empty).Append(del).              // 012 -  | ||||
|             Append(string.Empty).Append(del).              // 013 -  | ||||
|             Append(string.Empty).Append(del).              // 014 -  | ||||
|             Append(string.Empty).Append(del).              // 015 -  | ||||
|             Append(string.Empty).Append(del).              // 016 -  | ||||
|             Append(string.Empty).Append(del).              // 017 -  | ||||
|             Append(string.Empty).Append(del).              // 018 -  | ||||
|             Append(string.Empty).Append(del).              // 019 -  | ||||
|             Append(string.Empty).Append(del).              // 020 -  | ||||
|             Append(string.Empty).Append(del).              // 021 -  | ||||
|             Append(string.Empty).Append(del).              // 022 -  | ||||
|             Append(string.Empty).Append(del).              // 023 -  | ||||
|             Append(string.Empty).Append(del).              // 024 -  | ||||
|             Append(string.Empty).Append(del).              // 025 -  | ||||
|             Append(string.Empty).Append(del).              // 026 -  | ||||
|             Append(string.Empty).Append(del).              // 027 -  | ||||
|             Append(x.RDS).Append(del).             // 028 - Lot | ||||
|             Append(x.Reactor).Append(del).         // 029 - Process | ||||
|             Append(x.Recipe).Append(del).          // 030 - Part | ||||
|             Append(x.DcnScrMean).Append(del).      // 031 - Scratch Count | ||||
|             Append(string.Empty).Append(del).              // 032 -  | ||||
|             Append(string.Empty).Append(del).              // 033 -  | ||||
|             Append(string.Empty).Append(del).              // 034 -  | ||||
|             Append(x.DcnMicroScrMean).Append(del). // 035 - Scratch Length | ||||
|             Append(string.Empty).Append(del).              // 036 -  | ||||
|             Append(string.Empty).Append(del).              // 037 -  | ||||
|             Append(string.Empty).Append(del).              // 038 -  | ||||
|             Append(x.DcnAllMean).Append(del).      // 039 - Average Sum of Defects | ||||
|             Append(x.DcnAllMax).Append(del).       // 040 - Max Sum of defects | ||||
|             Append(x.DcnAllMin).Append(del).       // 041 - Min Sum of Defects | ||||
|             Append(string.Empty).Append(del).              // 042 -  | ||||
|             Append(logistics.MesEntity).Append(del).                 // 043 -  | ||||
|             Append(x.DcnAreaMean).Append(del).     // 044 - DCN MM2 | ||||
|             AppendLine(); | ||||
|         return new Tuple<string, string>(result.ToString(), x.Date); | ||||
|     } | ||||
|  | ||||
|     private void SaveIQSFile(string reportFullPath, DateTime dateTime, List<txt.Description> descriptions, Test[] tests) | ||||
|     { | ||||
|         if (tests.Length == 0) | ||||
| @ -116,7 +170,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         else | ||||
|         { | ||||
|             bool isDummyRun = false; | ||||
|             Tuple<string, string> lines = OpenInsight.FileRead.GetLines(_Logistics, descriptions); | ||||
|             Tuple<string, string> lines = GetLines(_Logistics, descriptions); | ||||
|             string check = lines.Item1.Replace(lines.Item2, "$Date$"); | ||||
|             ScopeInfo scopeInfo = new(tests[0], _IQSFile); | ||||
|             List<(Shared.Properties.IScopeInfo, string)> collection = new(); | ||||
| @ -132,7 +186,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void FileCopy<T>(string reportFullPath, DateTime dateTime, List<T> descriptions) where T : Shared.Properties.IDescription | ||||
|     private void WriteFile<T>(string reportFullPath, DateTime dateTime, List<T> descriptions) where T : Shared.Properties.IDescription | ||||
|     { | ||||
|         bool isDummyRun = false; | ||||
|         string successDirectory = string.Empty; | ||||
| @ -140,8 +194,9 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         string duplicateDirectory = Path.Combine(_FileConnectorConfiguration.SourceFileLocation, _CellInstanceName); | ||||
|         if (!Directory.Exists(duplicateDirectory)) | ||||
|             _ = Directory.CreateDirectory(duplicateDirectory); | ||||
|         string duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath)); | ||||
|         File.Copy(reportFullPath, duplicateFile, overwrite: true); | ||||
|         string duplicateFile = Path.Combine(duplicateDirectory, $"{Path.GetFileName(reportFullPath)}.xml"); | ||||
|         string xml = ProcessDataStandardFormat.GetXml(reportFullPath); | ||||
|         File.WriteAllText(duplicateFile, xml); | ||||
|         WaitForFileConsumption(dateTime, descriptions, isDummyRun, successDirectory, duplicateDirectory, collection, duplicateFile); | ||||
|     } | ||||
|  | ||||
| @ -157,8 +212,8 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             SaveIQSFile(reportFullPath, dateTime, descriptions, tests); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             FileCopy(reportFullPath, dateTime, descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|             WriteFile(reportFullPath, dateTime, descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -88,9 +88,9 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         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); | ||||
|         _ProcessDataStandardFormatMapping = ProcessDataStandardFormatMapping.Get(processDataStandardFormatMappingOldColumnNames, | ||||
|                                                                                  processDataStandardFormatMappingNewColumnNames, | ||||
|                                                                                  processDataStandardFormatMappingColumnIndices); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) | ||||
| @ -169,46 +169,6 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private static ProcessDataStandardFormatMapping GetProcessDataStandardFormatMapping(string processDataStandardFormatMappingOldColumnNames, string processDataStandardFormatMappingNewColumnNames, string processDataStandardFormatMappingColumnIndices) | ||||
|     { | ||||
|         ProcessDataStandardFormatMapping result; | ||||
|         string[] segmentsB; | ||||
|         List<string> distinct = new(); | ||||
|         Dictionary<string, string> keyValuePairs = new(); | ||||
|         string args4 = "Time,HeaderUniqueId,UniqueId,Date,SP101"; | ||||
|         string args5 = ",SP101"; | ||||
|         string args6 = ",SP101"; | ||||
|         string args7 = "Test|EventId,Recipe|Session,|SP101"; | ||||
|         // string args8 = "Time,A_LOGISTICS,B_LOGISTICS,Test,Count,Index,MesEntity,Date,Employee,Lot,PSN,Reactor,Recipe,Grade,HeaderUniqueId,RDS,Session,Side,SrcDest,UniqueId,WaferID,DcnAllMax,DcnAllMean,DcnAllMin,DcnAllStdDev,DcnAreaCountMax,DcnAreaCountMean,DcnAreaCountMin,DcnAreaCountStdDev,DcnAreaMax,DcnAreaMean,DcnAreaMin,DcnAreaStdDev,DcnBin1Max,DcnBin1Mean,DcnBin1Min,DcnBin1StdDev,DcnBin2Max,DcnBin2Mean,DcnBin2Min,DcnBin2StdDev,DcnBin3Max,DcnBin3Mean,DcnBin3Min,DcnBin3StdDev,DcnBin4Max,DcnBin4Mean,DcnBin4Min,DcnBin4StdDev,DcnBin5Max,DcnBin5Mean,DcnBin5Min,DcnBin5StdDev,DcnBin6Max,DcnBin6Mean,DcnBin6Min,DcnBin6StdDev,DcnBin7Max,DcnBin7Mean,DcnBin7Min,DcnBin7StdDev,DcnBin8Max,DcnBin8Mean,DcnBin8Min,DcnBin8StdDev,DcnHazeAvgMax,DcnHazeAvgMean,DcnHazeAvgMin,DcnHazeAvgStdDev,DcnHazeMedianMax,DcnHazeMedianMean,DcnHazeMedianMin,DcnHazeMedianStdDev,DcnHazeStdDevMax,DcnHazeStdDevMean,DcnHazeStdDevMin,DcnHazeStdDevStdDev,DcnLpdESMax,DcnLpdESMean,DcnLpdESMin,DcnLpdESStdDev,DcnLpdMax,DcnLpdMean,DcnLpdMin,DcnLpdNMax,DcnLpdNMean,DcnLpdNMin,DcnLpdNStdDev,DcnLpdStdDev,DcnMicroScrMax,DcnMicroScrMean,DcnMicroScrMin,DcnMicroScrStdDev,DcnScrMax,DcnScrMean,DcnScrMin,DcnScrStdDev,DcnSlipMax,DcnSlipMean,DcnSlipMin,DcnSlipStdDev,DnnAllMax,DnnAllMean,DnnAllMin,DnnAllStdDev,DnnAreaCountMax,DnnAreaCountMean,DnnAreaCountMin,DnnAreaCountStdDev,DnnAreaMax,DnnAreaMean,DnnAreaMin,DnnAreaStdDev,DnnBin1Max,DnnBin1Mean,DnnBin1Min,DnnBin1StdDev,DnnBin2Max,DnnBin2Mean,DnnBin2Min,DnnBin2StdDev,DnnBin3Max,DnnBin3Mean,DnnBin3Min,DnnBin3StdDev,DnnBin4Max,DnnBin4Mean,DnnBin4Min,DnnBin4StdDev,DnnBin5Max,DnnBin5Mean,DnnBin5Min,DnnBin5StdDev,DnnBin6Max,DnnBin6Mean,DnnBin6Min,DnnBin6StdDev,DnnBin7Max,DnnBin7Mean,DnnBin7Min,DnnBin7StdDev,DnnBin8Max,DnnBin8Mean,DnnBin8Min,DnnBin8StdDev,DnnHazeAvgMax,DnnHazeAvgMean,DnnHazeAvgMin,DnnHazeAvgStdDev,DnnHazeMedianMax,DnnHazeMedianMean,DnnHazeMedianMin,DnnHazeMedianStdDev,DnnHazeStdDevMax,DnnHazeStdDevMean,DnnHazeStdDevMin,DnnHazeStdDevStdDev,DnnLpdESMax,DnnLpdESMean,DnnLpdESMin,DnnLpdESStdDev,DnnLpdMax,DnnLpdMean,DnnLpdMin,DnnLpdNMax,DnnLpdNMean,DnnLpdNMin,DnnLpdNStdDev,DnnLpdStdDev,DnnMicroScrMax,DnnMicroScrMean,DnnMicroScrMin,DnnMicroScrStdDev,DnnScrMax,DnnScrMean,DnnScrMin,DnnScrStdDev,DnnSlipMax,DnnSlipMean,DnnSlipMin,DnnSlipStdDev,DwnAllMax,DwnAllMean,DwnAllMin,DwnAllStdDev,DwnAreaCountMax,DwnAreaCountMean,DwnAreaCountMin,DwnAreaCountStdDev,DwnAreaMax,DwnAreaMean,DwnAreaMin,DwnAreaStdDev,DwnBin1Max,DwnBin1Mean,DwnBin1Min,DwnBin1StdDev,DwnBin2Max,DwnBin2Mean,DwnBin2Min,DwnBin2StdDev,DwnBin3Max,DwnBin3Mean,DwnBin3Min,DwnBin3StdDev,DwnBin4Max,DwnBin4Mean,DwnBin4Min,DwnBin4StdDev,DwnBin5Max,DwnBin5Mean,DwnBin5Min,DwnBin5StdDev,DwnBin6Max,DwnBin6Mean,DwnBin6Min,DwnBin6StdDev,DwnBin7Max,DwnBin7Mean,DwnBin7Min,DwnBin7StdDev,DwnBin8Max,DwnBin8Mean,DwnBin8Min,DwnBin8StdDev,DwnHazeAvgMax,DwnHazeAvgMean,DwnHazeAvgMin,DwnHazeAvgStdDev,DwnHazeMedianMax,DwnHazeMedianMean,DwnHazeMedianMin,DwnHazeMedianStdDev,DwnHazeStdDevMax,DwnHazeStdDevMean,DwnHazeStdDevMin,DwnHazeStdDevStdDev,DwnLpdESMax,DwnLpdESMean,DwnLpdESMin,DwnLpdESStdDev,DwnLpdMax,DwnLpdMean,DwnLpdMin,DwnLpdNMax,DwnLpdNMean,DwnLpdNMin,DwnLpdNStdDev,DwnLpdStdDev,DwnMicroScrMax,DwnMicroScrMean,DwnMicroScrMin,DwnMicroScrStdDev,DwnScrMax,DwnScrMean,DwnScrMin,DwnScrStdDev,DwnSlipMax,DwnSlipMean,DwnSlipMin,DwnSlipStdDev,DcnAll,DcnArea,DcnAreaCount,DcnBin1,DcnBin2,DcnBin3,DcnBin4,DcnBin5,DcnBin6,DcnBin7,DcnBin8,DcnHazeAvg,DcnHazeMedian,DcnHazeStdDev,DcnLpd,DcnLpdES,DcnLpdN,DcnMicroScr,DcnScr,DcnSlip,DnnAll,DnnArea,DnnAreaCount,DnnBin1,DnnBin2,DnnBin3,DnnBin4,DnnBin5,DnnBin6,DnnBin7,DnnBin8,DnnHazeAvg,DnnHazeMedian,DnnHazeStdDev,DnnLpd,DnnLpdES,DnnLpdN,DnnMicroScr,DnnScr,DnnSlip,DwnAll,DwnArea,DwnAreaCount,DwnBin1,DwnBin2,DwnBin3,DwnBin4,DwnBin5,DwnBin6,DwnBin7,DwnBin8,DwnHazeAvg,DwnHazeMedian,DwnHazeStdDev,DwnLpd,DwnLpdES,DwnLpdN,DwnMicroScr,DwnScr,DwnSlip"; | ||||
|         // string args9 = "Time,A_LOGISTICS,B_LOGISTICS,Count,Sequence,MesEntity,Index,Lot,Session,DcnAllMin,DcnLpdMin,DcnLpdNMin,DcnLpdESMin,DcnMicroScrMin,DcnScrMin,DcnSlipMin,DcnAreaCountMin,DcnAreaMin,DcnHazeAvgMin,DcnHazeMedianMin,DcnHazeStdDevMin,DcnBin1Min,DcnBin2Min,DcnBin3Min,DcnBin4Min,DcnBin5Min,DcnBin6Min,DcnBin7Min,DcnBin8Min,DcnAllMax,DcnLpdMax,DcnLpdNMax,DcnLpdESMax,DcnMicroScrMax,DcnScrMax,DcnSlipMax,DcnAreaCountMax,DcnAreaMax,DcnHazeAvgMax,DcnHazeMedianMax,DcnHazeStdDevMax,DcnBin1Max,DcnBin2Max,DcnBin3Max,DcnBin4Max,DcnBin5Max,DcnBin6Max,DcnBin7Max,DcnBin8Max,DcnAllMean,DcnLpdMean,DcnLpdNMean,DcnLpdESMean,DcnMicroScrMean,DcnScrMean,DcnSlipMean,DcnAreaCountMean,DcnAreaMean,DcnHazeAvgMean,DcnHazeMedianMean,DcnHazeStdDevMean,DcnBin1Mean,DcnBin2Mean,DcnBin3Mean,DcnBin4Mean,DcnBin5Mean,DcnBin6Mean,DcnBin7Mean,DcnBin8Mean,DcnAllStdDev,DcnLpdStdDev,DcnLpdNStdDev,DcnLpdESStdDev,DcnMicroScrStdDev,DcnScrStdDev,DcnSlipStdDev,DcnAreaCountStdDev,DcnAreaStdDev,DcnHazeAvgStdDev,DcnHazeMedianStdDev,DcnHazeStdDevStdDev,DcnBin1StdDev,DcnBin2StdDev,DcnBin3StdDev,DcnBin4StdDev,DcnBin5StdDev,DcnBin6StdDev,DcnBin7StdDev,DcnBin8StdDev,DwnAllMin,DwnLpdMin,DwnLpdNMin,DwnLpdESMin,DwnMicroScrMin,DwnScrMin,DwnSlipMin,DwnAreaCountMin,DwnAreaMin,DwnHazeAvgMin,DwnHazeMedianMin,DwnHazeStdDevMin,DwnBin1Min,DwnBin2Min,DwnBin3Min,DwnBin4Min,DwnBin5Min,DwnBin6Min,DwnBin7Min,DwnBin8Min,DwnAllMax,DwnLpdMax,DwnLpdNMax,DwnLpdESMax,DwnMicroScrMax,DwnScrMax,DwnSlipMax,DwnAreaCountMax,DwnAreaMax,DwnHazeAvgMax,DwnHazeMedianMax,DwnHazeStdDevMax,DwnBin1Max,DwnBin2Max,DwnBin3Max,DwnBin4Max,DwnBin5Max,DwnBin6Max,DwnBin7Max,DwnBin8Max,DwnAllMean,DwnLpdMean,DwnLpdNMean,DwnLpdESMean,DwnMicroScrMean,DwnScrMean,DwnSlipMean,DwnAreaCountMean,DwnAreaMean,DwnHazeAvgMean,DwnHazeMedianMean,DwnHazeStdDevMean,DwnBin1Mean,DwnBin2Mean,DwnBin3Mean,DwnBin4Mean,DwnBin5Mean,DwnBin6Mean,DwnBin7Mean,DwnBin8Mean,DwnAllStdDev,DwnLpdStdDev,DwnLpdNStdDev,DwnLpdESStdDev,DwnMicroScrStdDev,DwnScrStdDev,DwnSlipStdDev,DwnAreaCountStdDev,DwnAreaStdDev,DwnHazeAvgStdDev,DwnHazeMedianStdDev,DwnHazeStdDevStdDev,DwnBin1StdDev,DwnBin2StdDev,DwnBin3StdDev,DwnBin4StdDev,DwnBin5StdDev,DwnBin6StdDev,DwnBin7StdDev,DwnBin8StdDev,DnnAllMin,DnnLpdMin,DnnLpdNMin,DnnLpdESMin,DnnMicroScrMin,DnnScrMin,DnnSlipMin,DnnAreaCountMin,DnnAreaMin,DnnHazeAvgMin,DnnHazeMedianMin,DnnHazeStdDevMin,DnnBin1Min,DnnBin2Min,DnnBin3Min,DnnBin4Min,DnnBin5Min,DnnBin6Min,DnnBin7Min,DnnBin8Min,DnnAllMax,DnnLpdMax,DnnLpdNMax,DnnLpdESMax,DnnMicroScrMax,DnnScrMax,DnnSlipMax,DnnAreaCountMax,DnnAreaMax,DnnHazeAvgMax,DnnHazeMedianMax,DnnHazeStdDevMax,DnnBin1Max,DnnBin2Max,DnnBin3Max,DnnBin4Max,DnnBin5Max,DnnBin6Max,DnnBin7Max,DnnBin8Max,DnnAllMean,DnnLpdMean,DnnLpdNMean,DnnLpdESMean,DnnMicroScrMean,DnnScrMean,DnnSlipMean,DnnAreaCountMean,DnnAreaMean,DnnHazeAvgMean,DnnHazeMedianMean,DnnHazeStdDevMean,DnnBin1Mean,DnnBin2Mean,DnnBin3Mean,DnnBin4Mean,DnnBin5Mean,DnnBin6Mean,DnnBin7Mean,DnnBin8Mean,DnnAllStdDev,DnnLpdStdDev,DnnLpdNStdDev,DnnLpdESStdDev,DnnMicroScrStdDev,DnnScrStdDev,DnnSlipStdDev,DnnAreaCountStdDev,DnnAreaStdDev,DnnHazeAvgStdDev,DnnHazeMedianStdDev,DnnHazeStdDevStdDev,DnnBin1StdDev,DnnBin2StdDev,DnnBin3StdDev,DnnBin4StdDev,DnnBin5StdDev,DnnBin6StdDev,DnnBin7StdDev,DnnBin8StdDev,Side,WaferID,Grade,SrcDest,DcnAll,DcnLpd,DcnLpdN,DcnLpdES,DcnMicroScr,DcnScr,DcnSlip,DcnAreaCount,DcnArea,DcnHazeAvg,DcnHazeMedian,DcnHazeStdDev,DcnBin1,DcnBin2,DcnBin3,DcnBin4,DcnBin5,DcnBin6,DcnBin7,DcnBin8,DwnAll,DwnLpd,DwnLpdN,DwnLpdES,DwnMicroScr,DwnScr,DwnSlip,DwnAreaCount,DwnArea,DwnHazeAvg,DwnHazeMedian,DwnHazeStdDev,DwnBin1,DwnBin2,DwnBin3,DwnBin4,DwnBin5,DwnBin6,DwnBin7,DwnBin8,DnnAll,DnnLpd,DnnLpdN,DnnLpdES,DnnMicroScr,DnnScr,DnnSlip,DnnAreaCount,DnnArea,DnnHazeAvg,DnnHazeMedian,DnnHazeStdDev,DnnBin1,DnnBin2,DnnBin3,DnnBin4,DnnBin5,DnnBin6,DnnBin7,DnnBin8,RDS,PSN,Reactor,Layer,Zone,Employee,InferredLot,Date,EventId"; | ||||
|         // string args10 = "0,1,2,319,3,6,5,320,318,7,314,315,8,251,-1,313,8,249,252,-1,250,29,49,9,69,36,56,16,76,37,57,17,77,41,61,21,81,42,62,22,82,43,63,23,83,44,64,24,84,45,65,25,85,46,66,26,86,47,67,27,87,48,68,28,88,38,58,18,78,39,59,19,79,40,60,20,80,32,52,12,72,30,50,10,31,51,11,71,70,33,53,13,73,34,54,14,74,35,55,15,75,189,209,169,229,196,216,176,236,197,217,177,237,201,221,181,241,202,222,182,242,203,223,183,243,204,224,184,244,205,225,185,245,206,226,186,246,207,227,187,247,208,228,188,248,198,218,178,238,199,219,179,239,200,220,180,240,192,212,172,232,190,210,170,191,211,171,231,230,193,213,173,233,194,214,174,234,195,215,175,235,109,129,89,149,116,136,96,156,117,137,97,157,121,141,101,161,122,142,102,162,123,143,103,163,124,144,104,164,125,145,105,165,126,146,106,166,127,147,107,167,128,148,108,168,118,138,98,158,119,139,99,159,120,140,100,160,112,132,92,152,110,130,90,111,131,91,151,150,113,133,93,153,114,134,94,154,115,135,95,155,253,261,260,265,266,267,268,269,270,271,272,262,263,264,254,256,255,257,258,259,293,301,300,305,306,307,308,309,310,311,312,302,303,304,294,296,295,297,298,299,273,281,280,285,286,287,288,289,290,291,292,282,283,284,274,276,275,277,278,279"; | ||||
|         string[] segments = args7.Split(','); | ||||
|         ReadOnlyCollection<string> ignoreColumns = new(args4.Split(',')); | ||||
|         ReadOnlyCollection<string> backfillColumns = new(args5.Split(',')); | ||||
|         ReadOnlyCollection<string> indexOnlyColumns = new(args6.Split(',')); | ||||
|         ReadOnlyCollection<string> newColumnNames = new(processDataStandardFormatMappingNewColumnNames.Split(',')); | ||||
|         ReadOnlyCollection<string> oldColumnNames = new(processDataStandardFormatMappingOldColumnNames.Split(',')); | ||||
|         ReadOnlyCollection<int> columnIndices = new(processDataStandardFormatMappingColumnIndices.Split(',').Select(int.Parse).ToArray()); | ||||
|         foreach (string segment in segments) | ||||
|         { | ||||
|             segmentsB = segment.Split('|'); | ||||
|             if (segmentsB.Length != 2) | ||||
|                 continue; | ||||
|             if (distinct.Contains(segmentsB[0])) | ||||
|                 continue; | ||||
|             distinct.Add(segmentsB[0]); | ||||
|             keyValuePairs.Add(segmentsB[0], segmentsB[1]); | ||||
|         } | ||||
|         result = new(backfillColumns: backfillColumns, | ||||
|                      columnIndices: columnIndices, | ||||
|                      newColumnNames: newColumnNames, | ||||
|                      ignoreColumns: ignoreColumns, | ||||
|                      indexOnlyColumns: indexOnlyColumns, | ||||
|                      keyValuePairs: new(keyValuePairs), | ||||
|                      oldColumnNames: oldColumnNames); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static ReadOnlyCollection<PreWith> GetPreWithCollection(ReadOnlyCollection<Pre> preCollection) | ||||
|     { | ||||
|         List<PreWith> results = new(); | ||||
| @ -268,7 +228,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static ReadOnlyCollection<Pre> GetPreCollection(int numberLength, string parentDirectory, ReadOnlyCollection<string> matchingFiles, bool _) | ||||
|     private static ReadOnlyCollection<Pre> GetPreCollection(int numberLength, string parentDirectory, ReadOnlyCollection<string> matchingFiles) | ||||
|     { | ||||
|         List<Pre> results = new(); | ||||
|         Pre pre; | ||||
| @ -313,8 +273,13 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|                 continue; | ||||
|             if (!_StaticRuns.TryGetValue(_Logistics.Sequence, out List<Shared.Metrology.WS.Results>? wsResults)) | ||||
|                 wsResults = null; | ||||
|             ProcessDataStandardFormat.Write(preWith.CheckFile, processDataStandardFormat, wsResults); | ||||
|             File.Delete(preWith.MatchingFile); | ||||
|             if (processDataStandardFormat.InputPDSF is null) | ||||
|                 File.Move(preWith.MatchingFile, preWith.CheckFile); | ||||
|             else | ||||
|             { | ||||
|                 ProcessDataStandardFormat.Write(preWith.CheckFile, processDataStandardFormat, wsResults); | ||||
|                 File.Delete(preWith.MatchingFile); | ||||
|             } | ||||
|             if (Directory.Exists(preWith.NoWaitDirectory)) | ||||
|             { | ||||
|                 post = new(preWith.CheckFile, preWith.ErrFile); | ||||
| @ -366,10 +331,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|             { CreatePointerFile(numberLength, parentParentDirectory, matchingFiles); } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
|         JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat); | ||||
|         List<txt.Description> descriptions = txt.ProcessData.GetDescriptions(jsonElements); | ||||
|         bool mesEntityMatchesProcess = descriptions.Count > 0 && descriptions[0].MesEntity == descriptions[0].Reactor; | ||||
|         ReadOnlyCollection<Pre> preCollection = GetPreCollection(numberLength, parentParentDirectory, matchingFiles, mesEntityMatchesProcess); | ||||
|         ReadOnlyCollection<Pre> preCollection = GetPreCollection(numberLength, parentParentDirectory, matchingFiles); | ||||
|         ReadOnlyCollection<PreWith> preWithCollection = GetPreWithCollection(preCollection); | ||||
|         MoveCollection(dateTime, processDataStandardFormat, preWithCollection); | ||||
|         return results; | ||||
|  | ||||
| @ -9,7 +9,6 @@ using System.Collections.Generic; | ||||
| using System.Globalization; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.OpenInsight; | ||||
| @ -17,9 +16,7 @@ namespace Adaptation.FileHandlers.OpenInsight; | ||||
| public class FileRead : Shared.FileRead, IFileRead | ||||
| { | ||||
|  | ||||
|     private string _LastLines; | ||||
|     private readonly string _IqsConnectionString; | ||||
|     private readonly string _OpenInsightFilePattern; | ||||
|     private readonly string _OpenInsightApiECDirectory; | ||||
|  | ||||
|     public FileRead(ISMTP smtp, Dictionary<string, string> fileParameter, string cellInstanceName, int? connectionCount, string cellInstanceConnectionName, FileConnectorConfiguration fileConnectorConfiguration, string equipmentTypeName, string parameterizedModelObjectDefinitionType, IList<ModelObjectParameterDefinition> modelObjectParameters, string equipmentDictionaryName, Dictionary<string, List<long>> dummyRuns, Dictionary<long, List<WS.Results>> staticRuns, bool useCyclicalForDescription, bool isEAFHosted) : | ||||
| @ -34,10 +31,8 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         if (!_IsDuplicator) | ||||
|             throw new Exception(cellInstanceConnectionName); | ||||
|         _LastLines = string.Empty; | ||||
|         _IqsConnectionString = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "IQS.ConnectionString"); | ||||
|         _OpenInsightApiECDirectory = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "API.EC.Directory"); | ||||
|         _OpenInsightFilePattern = GetPropertyValue(cellInstanceConnectionName, modelObjectParameters, "OpenInsight.FilePattern"); | ||||
|     } | ||||
|  | ||||
|     void IFileRead.Move(Tuple<string, Test[], JsonElement[], List<FileInfo>> extractResults, Exception exception) | ||||
| @ -115,105 +110,45 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     internal static Tuple<string, string> GetLines(Logistics logistics, List<txt.Description> descriptions) | ||||
|     { | ||||
|         StringBuilder result = new(); | ||||
|         char del = '\t'; | ||||
|         txt.Description x = descriptions[0]; | ||||
|         _ = result.Append(x.DcnLpdMin).Append(del).    // 001 -  | ||||
|             Append(x.DcnLpdMax).Append(del).       // 002 -  | ||||
|             Append(x.DcnLpdMean).Append(del).      // 003 - DCN LPD | ||||
|             Append(x.DcnAreaCountMin).Append(del). // 004 -  | ||||
|             Append(x.DcnAreaCountMax).Append(del). // 005 -  | ||||
|             Append(x.DcnAreaCountMean).Append(del).// 006 - DCN Area | ||||
|             Append(x.DcnAreaMin).Append(del).      // 007 -  | ||||
|             Append(x.DcnAreaMax).Append(del).      // 008 -  | ||||
|             Append(x.Date).Append(del).            // 009 -  | ||||
|             Append(x.DcnHazeAvgMean).Append(del).  // 010 - Haze Average | ||||
|             Append(string.Empty).Append(del).              // 011 -  | ||||
|             Append(string.Empty).Append(del).              // 012 -  | ||||
|             Append(string.Empty).Append(del).              // 013 -  | ||||
|             Append(string.Empty).Append(del).              // 014 -  | ||||
|             Append(string.Empty).Append(del).              // 015 -  | ||||
|             Append(string.Empty).Append(del).              // 016 -  | ||||
|             Append(string.Empty).Append(del).              // 017 -  | ||||
|             Append(string.Empty).Append(del).              // 018 -  | ||||
|             Append(string.Empty).Append(del).              // 019 -  | ||||
|             Append(string.Empty).Append(del).              // 020 -  | ||||
|             Append(string.Empty).Append(del).              // 021 -  | ||||
|             Append(string.Empty).Append(del).              // 022 -  | ||||
|             Append(string.Empty).Append(del).              // 023 -  | ||||
|             Append(string.Empty).Append(del).              // 024 -  | ||||
|             Append(string.Empty).Append(del).              // 025 -  | ||||
|             Append(string.Empty).Append(del).              // 026 -  | ||||
|             Append(string.Empty).Append(del).              // 027 -  | ||||
|             Append(x.RDS).Append(del).             // 028 - Lot | ||||
|             Append(x.Reactor).Append(del).         // 029 - Process | ||||
|             Append(x.Recipe).Append(del).          // 030 - Part | ||||
|             Append(x.DcnScrMean).Append(del).      // 031 - Scratch Count | ||||
|             Append(string.Empty).Append(del).              // 032 -  | ||||
|             Append(string.Empty).Append(del).              // 033 -  | ||||
|             Append(string.Empty).Append(del).              // 034 -  | ||||
|             Append(x.DcnMicroScrMean).Append(del). // 035 - Scratch Length | ||||
|             Append(string.Empty).Append(del).              // 036 -  | ||||
|             Append(string.Empty).Append(del).              // 037 -  | ||||
|             Append(string.Empty).Append(del).              // 038 -  | ||||
|             Append(x.DcnAllMean).Append(del).      // 039 - Average Sum of Defects | ||||
|             Append(x.DcnAllMax).Append(del).       // 040 - Max Sum of defects | ||||
|             Append(x.DcnAllMin).Append(del).       // 041 - Min Sum of Defects | ||||
|             Append(string.Empty).Append(del).              // 042 -  | ||||
|             Append(logistics.MesEntity).Append(del).                 // 043 -  | ||||
|             Append(x.DcnAreaMean).Append(del).     // 044 - DCN MM2 | ||||
|             AppendLine(); | ||||
|         return new Tuple<string, string>(result.ToString(), x.Date); | ||||
|     } | ||||
|  | ||||
|     private void SaveOpenInsightFile(string reportFullPath, DateTime dateTime, ProcessDataStandardFormat processDataStandardFormat, List<txt.Description> descriptions, Test[] tests) | ||||
|     { | ||||
|         string duplicateFile; | ||||
|         bool isDummyRun = false; | ||||
|         List<(Shared.Properties.IScopeInfo, string)> collection = new(); | ||||
|         string duplicateDirectory = Path.Combine(_FileConnectorConfiguration.SourceFileLocation, _CellInstanceName); | ||||
|         if (!Directory.Exists(duplicateDirectory)) | ||||
|             _ = Directory.CreateDirectory(duplicateDirectory); | ||||
|         string successDirectory = _FileConnectorConfiguration.AlternateTargetFolder; | ||||
|         if (!Directory.Exists(Path.Combine(duplicateDirectory, "1"))) | ||||
|         { | ||||
|             string parentParent = GetParentParent(_FileConnectorConfiguration.SourceFileLocation); | ||||
|             if (parentParent.Contains(_CellInstanceName)) | ||||
|                 parentParent = Path.GetDirectoryName(parentParent); | ||||
|             duplicateDirectory = Path.Combine(parentParent, "Data"); | ||||
|             if (!Directory.Exists(duplicateDirectory)) | ||||
|                 _ = Directory.CreateDirectory(duplicateDirectory); | ||||
|         } | ||||
|         string duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath)); | ||||
|         if (descriptions.Count == 0 || tests.Length == 0) | ||||
|             _LastLines = string.Empty; | ||||
|             duplicateFile = Path.Combine(duplicateDirectory, Path.GetFileName(reportFullPath)); | ||||
|         else | ||||
|         { | ||||
|             Tuple<string, string> lines = GetLines(_Logistics, descriptions); | ||||
|             string check = lines.Item1.Replace(lines.Item2, "$Date$"); | ||||
|             bool save = string.IsNullOrEmpty(_LastLines) || check != _LastLines; | ||||
|             if (save && !string.IsNullOrEmpty(check)) | ||||
|             long? subgroupId; | ||||
|             string fileName = Path.GetFileName(reportFullPath); | ||||
|             long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks; | ||||
|             long preWait = _FileConnectorConfiguration?.FileHandleWaitTime is null ? dateTime.AddMilliseconds(1234).Ticks : dateTime.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks; | ||||
|             if (string.IsNullOrEmpty(descriptions[0].Reactor) || string.IsNullOrEmpty(descriptions[0].PSN)) | ||||
|                 subgroupId = null; | ||||
|             else | ||||
|                 (subgroupId, int? _, string _) = FromIQS.GetCommandText(_IqsConnectionString, _Logistics, descriptions[0], breakAfter, preWait); | ||||
|             if (_StaticRuns.TryGetValue(_Logistics.Sequence, out List<WS.Results> wsResults)) | ||||
|             { | ||||
|                 long? subgroupId; | ||||
|                 _LastLines = check; | ||||
|                 long breakAfter = dateTime.AddSeconds(_BreakAfterSeconds).Ticks; | ||||
|                 long preWait = _FileConnectorConfiguration?.FileHandleWaitTime is null ? dateTime.AddMilliseconds(1234).Ticks : dateTime.AddMilliseconds(_FileConnectorConfiguration.FileHandleWaitTime.Value).Ticks; | ||||
|                 if (string.IsNullOrEmpty(descriptions[0].Reactor) || string.IsNullOrEmpty(descriptions[0].PSN)) | ||||
|                     subgroupId = null; | ||||
|                 else | ||||
|                     (subgroupId, int? _, string _) = FromIQS.GetCommandText(_IqsConnectionString, _Logistics, descriptions[0], breakAfter, preWait); | ||||
|                 if (subgroupId is null) | ||||
|                     collection.Add(new(new ScopeInfo(tests[0], _OpenInsightFilePattern), lines.Item1)); | ||||
|                 else | ||||
|                     collection.Add(new(new ScopeInfo(tests[0], $"{subgroupId.Value} {_OpenInsightFilePattern}"), lines.Item1)); | ||||
|                 string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|                 FromIQS.Save(_OpenInsightApiECDirectory, _Logistics, reportFullPath, processDataStandardFormat, descriptions.First(), lines.Item1, subgroupId, weekOfYear); | ||||
|                 if (wsResults is null || wsResults.Count != 1) | ||||
|                     throw new NullReferenceException($"{nameof(wsResults)} {wsResults?.Count} != 1 {_Logistics.Sequence}!"); | ||||
|                 lock (_StaticRuns) | ||||
|                     wsResults[0] = WS.Results.Get(wsResults[0], subgroupId); | ||||
|             } | ||||
|             if (!Directory.Exists(duplicateDirectory)) | ||||
|                 _ = Directory.CreateDirectory(duplicateDirectory); | ||||
|             if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|                 WaitForFileConsumption(dateTime, descriptions, isDummyRun, successDirectory, duplicateDirectory, collection, duplicateFile); | ||||
|             if (!fileName.StartsWith("Viewer")) | ||||
|                 duplicateFile = Path.Combine(duplicateDirectory, $"{subgroupId} {fileName}".TrimStart()); | ||||
|             else | ||||
|                 duplicateFile = Path.Combine(duplicateDirectory, $"{$"Viewer {subgroupId}".TrimEnd()} {fileName.Replace("Viewer", string.Empty)}"); | ||||
|             string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|             FromIQS.Save(_OpenInsightApiECDirectory, _Logistics, reportFullPath, processDataStandardFormat, descriptions.First(), subgroupId, weekOfYear); | ||||
|         } | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|         { | ||||
|             File.Copy(reportFullPath, duplicateFile, overwrite: true); | ||||
|             WaitForFileConsumption(dateTime, descriptions, isDummyRun, successDirectory, duplicateDirectory, collection, duplicateFile); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -228,7 +163,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             SaveOpenInsightFile(reportFullPath, dateTime, processDataStandardFormat, descriptions, tests); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -376,7 +376,7 @@ public class FromIQS | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     internal static void Save(string openInsightApiECDirectory, Logistics logistics, string reportFullPath, ProcessDataStandardFormat processDataStandardFormat, txt.Description description, string lines, long? subGroupId, string weekOfYear) | ||||
|     internal static void Save(string openInsightApiECDirectory, Logistics logistics, string reportFullPath, ProcessDataStandardFormat processDataStandardFormat, txt.Description description, long? subGroupId, string weekOfYear) | ||||
|     { | ||||
|         string checkFile; | ||||
|         string fileName = Path.GetFileName(reportFullPath); | ||||
| @ -390,15 +390,9 @@ public class FromIQS | ||||
|         checkFile = Path.Combine(ecDirectory, fileName); | ||||
|         if (ecExists && !File.Exists(checkFile)) | ||||
|             File.Copy(reportFullPath, checkFile); | ||||
|         checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.txt"); | ||||
|         if (ecExists && !File.Exists(checkFile)) | ||||
|             File.WriteAllText(checkFile, lines); | ||||
|         checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.json"); | ||||
|         if (ecExists && !File.Exists(checkFile)) | ||||
|             File.WriteAllText(checkFile, json); | ||||
|         checkFile = Path.Combine(ecDirectory, $"{logistics.DateTimeFromSequence.Ticks}.lbl"); | ||||
|         if (ecExists && !File.Exists(checkFile)) | ||||
|             File.WriteAllText(checkFile, processDataStandardFormat.Body[processDataStandardFormat.Body.Count - 1]); | ||||
|     } | ||||
|  | ||||
|     private static string GetCommandText(string[] iqsCopyValues) | ||||
|  | ||||
| @ -147,7 +147,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             SendData(reportFullPath, dateTime, descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -175,7 +175,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             PostOpenInsightMetrologyViewerAttachments(descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -172,7 +172,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         JsonElement[] jsonElements = ProcessDataStandardFormat.GetArray(processDataStandardFormat); | ||||
|         List<txt.Description> descriptions = txt.ProcessData.GetDescriptions(jsonElements); | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             DirectoryMove(reportFullPath, dateTime, descriptions); | ||||
|         else if (!_IsEAFHosted) | ||||
|  | ||||
| @ -125,7 +125,7 @@ public class FileRead : Shared.FileRead, IFileRead | ||||
|         Test[] tests = (from l in descriptions select (Test)l.Test).ToArray(); | ||||
|         if (_IsEAFHosted && _FileConnectorConfiguration.FileScanningIntervalInSeconds > 0) | ||||
|             FileCopy(reportFullPath, dateTime, descriptions); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics[0]), tests, jsonElements, new List<FileInfo>()); | ||||
|         results = new Tuple<string, Test[], JsonElement[], List<FileInfo>>(string.Join(Environment.NewLine, processDataStandardFormat.Logistics), tests, jsonElements, new List<FileInfo>()); | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|  | ||||
| @ -11,13 +11,17 @@ public class Common | ||||
|     public int? ReactorNumber { get; } | ||||
|     public string? Zone { get; } | ||||
|     public string? Employee { get; } | ||||
|     public RunDataSheetRoot? RunDataSheetRoot { get; } | ||||
|     public WorkOrder? WorkOrder { get; } | ||||
|  | ||||
|     public Common(string? layer, | ||||
|                   string? psn, | ||||
|                   int? rdsNumber, | ||||
|                   int? reactor, | ||||
|                   string? zone, | ||||
|                   string? employee) | ||||
|                   string? employee, | ||||
|                   RunDataSheetRoot? runDataSheetRoot, | ||||
|                   WorkOrder? workOrder) | ||||
|     { | ||||
|         Layer = layer; | ||||
|         PSN = psn; | ||||
| @ -25,6 +29,8 @@ public class Common | ||||
|         ReactorNumber = reactor; | ||||
|         Zone = zone; | ||||
|         Employee = employee; | ||||
|         RunDataSheetRoot = runDataSheetRoot; | ||||
|         WorkOrder = workOrder; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -3,18 +3,20 @@ namespace Adaptation.FileHandlers.TIBCO.Transport; | ||||
| public class CommonB | ||||
| { | ||||
|  | ||||
|     public string Comment { get; } | ||||
|     public string Layer { get; } | ||||
|     public string LoadLockSide { get; } | ||||
|     public int? RDSNumber { get; } | ||||
|     public string ReactorType { get; } | ||||
|     public string PSN { get; } | ||||
|     public int? ReactorNumber { get; } | ||||
|     public string Zone { get; } | ||||
|  | ||||
|     public CommonB(string comment, string layer, int? rdsNumber, string psn, int? reactorNumber, string zone) | ||||
|     public CommonB(string layer, string loadLockSide, int? rdsNumber, string reactorType, string psn, int? reactorNumber, string zone) | ||||
|     { | ||||
|         Comment = comment; | ||||
|         Layer = layer; | ||||
|         LoadLockSide = loadLockSide; | ||||
|         RDSNumber = rdsNumber; | ||||
|         ReactorType = reactorType; | ||||
|         PSN = psn; | ||||
|         ReactorNumber = reactorNumber; | ||||
|         Zone = zone; | ||||
|  | ||||
| @ -7,15 +7,17 @@ public class Input | ||||
|  | ||||
|     public string? Area { get; } | ||||
|     public string? EquipmentType { get; } | ||||
|     public string? MID { get; } | ||||
|     public string? Slot { get; } | ||||
|     public string? LoadLock { get; } | ||||
|     public string? MesEntity { get; } | ||||
|     public string? MID { get; } | ||||
|     public string? Recipe { get; } | ||||
|     public string? Sequence { get; } | ||||
|     public string? Slot { get; } | ||||
|  | ||||
|     [System.Text.Json.Serialization.JsonConstructor] | ||||
|     public Input(string? area, | ||||
|                  string? equipmentType, | ||||
|                  string? loadLock, | ||||
|                  string? mid, | ||||
|                  string? slot, | ||||
|                  string? mesEntity, | ||||
| @ -25,6 +27,7 @@ public class Input | ||||
|  | ||||
|         Area = area; | ||||
|         EquipmentType = equipmentType; | ||||
|         LoadLock = loadLock; | ||||
|         MID = mid; | ||||
|         Slot = slot; | ||||
|         MesEntity = mesEntity; | ||||
| @ -36,6 +39,7 @@ public class Input | ||||
|     { | ||||
|         Area = input.Area; | ||||
|         EquipmentType = input.EquipmentType; | ||||
|         LoadLock = input.LoadLock; | ||||
|         MID = mid; | ||||
|         Slot = input.Slot; | ||||
|         MesEntity = input.MesEntity; | ||||
|  | ||||
| @ -41,7 +41,7 @@ public partial class Job | ||||
|     public DateTime DateTime { get; } | ||||
|     public List<Item> Items { get; } | ||||
|  | ||||
|     public Job(string lsl2SQLConnectionString, string metrologyFileShare, string barcodeHostFileShare, HttpClient httpClient, string mid) | ||||
|     public Job(string lsl2SQLConnectionString, string metrologyFileShare, string barcodeHostFileShare, HttpClient httpClient, string mid, DateTime enteredDateTimeFilter, DateTime loadSignatureDateTimeFilter) | ||||
|     { | ||||
|         const int zero = 0; | ||||
|         Items = new List<Item>(); | ||||
| @ -52,10 +52,10 @@ public partial class Job | ||||
|             Common common; | ||||
|             CommonB commonB; | ||||
|             int? reactorNumber; | ||||
|             WorkOrder workOrder; | ||||
|             const string hyphen = "-"; | ||||
|             const string bioRad2 = "BIORAD2"; | ||||
|             const string bioRad3 = "BIORAD3"; | ||||
|             RunDataSheetRoot? runDataSheetRoot; | ||||
|             const string twoAlphaPattern = "^[a-zA-z]{2,3}"; | ||||
|             const string reactorNumberPattern = @"^[0-9]{2}--"; | ||||
|             Input input = JsonSerializer.Deserialize<Input>(mid) ?? throw new Exception(); | ||||
| @ -65,42 +65,53 @@ public partial class Job | ||||
|                 DateTime = new DateTime(sequence); | ||||
|             const string dep08CEPIEPSILON = "DEP08CEPIEPSILON"; | ||||
|             if (input.EquipmentType == dep08CEPIEPSILON) | ||||
|                 (common, workOrder) = Get(input, httpClient); | ||||
|                 common = ReactorGet(input, httpClient); | ||||
|             else if (!string.IsNullOrEmpty(input.MID) && !string.IsNullOrEmpty(input.MesEntity) && Regex.IsMatch(input.MID, reactorNumberPattern) && input.MesEntity is bioRad2 or bioRad3) | ||||
|                 (common, workOrder) = Get(input, barcodeHostFileShare); | ||||
|                 common = Get(input, barcodeHostFileShare, httpClient); | ||||
|             else | ||||
|             { | ||||
|                 workOrder = GetWorkOrder(input); | ||||
|                 reactorNumber = GetReactorNumber(input); | ||||
|                 WorkOrder workOrder = GetWorkOrder(input); | ||||
|                 if (workOrder.IsWorkOrder || reactorNumber.HasValue) | ||||
|                     common = new(layer: null, | ||||
|                                  psn: null, | ||||
|                                  rdsNumber: null, | ||||
|                                  reactor: null, | ||||
|                                  zone: null, | ||||
|                                  employee: null); | ||||
|                                  employee: null, | ||||
|                                  runDataSheetRoot: null, | ||||
|                                  workOrder: workOrder); | ||||
|                 else if (!string.IsNullOrEmpty(input.MID) && input.MID.Length is 2 or 3 && Regex.IsMatch(input.MID, twoAlphaPattern)) | ||||
|                     common = GetTwoAlphaPattern(metrologyFileShare, input); | ||||
|                 else | ||||
|                     common = Get(input); | ||||
|                     common = Get(input, httpClient); | ||||
|             } | ||||
|             bool isValid = IsValid(common.RDSNumber); | ||||
|             if (isValid) | ||||
|                 commonB = GetWithValidRDS(lsl2SQLConnectionString, common.Layer, common.PSN, common.RDSNumber, common.ReactorNumber, common.Zone); | ||||
|             else if (workOrder.IsWorkOrder || common.RDSNumber.HasValue) | ||||
|                 commonB = Get(lsl2SQLConnectionString, common.Layer, common.PSN, common.ReactorNumber, workOrder.SlotNumber, workOrder.WorkOrderNumber, workOrder.WorkOrderCassette, common.Zone); | ||||
|                 commonB = GetWithValidRDS(lsl2SQLConnectionString, enteredDateTimeFilter, loadSignatureDateTimeFilter, common.Layer, common.PSN, common.RDSNumber, common.ReactorNumber, common.Zone); | ||||
|             else if (common.WorkOrder is null || common.WorkOrder.IsWorkOrder || common.RDSNumber.HasValue) | ||||
|                 commonB = Get(lsl2SQLConnectionString, enteredDateTimeFilter, loadSignatureDateTimeFilter, common); | ||||
|             else | ||||
|                 commonB = new(comment: hyphen, | ||||
|                               layer: hyphen, | ||||
|                 commonB = new(layer: hyphen, | ||||
|                               loadLockSide: hyphen, | ||||
|                               rdsNumber: common.RDSNumber, | ||||
|                               reactorType: hyphen, | ||||
|                               psn: common.PSN, | ||||
|                               reactorNumber: common.ReactorNumber, | ||||
|                               zone: hyphen); | ||||
|             if (commonB.RDSNumber is null || common.RunDataSheetRoot is not null) | ||||
|                 runDataSheetRoot = common.RunDataSheetRoot; | ||||
|             else | ||||
|             { | ||||
|                 try | ||||
|                 { runDataSheetRoot = GetRunDataSheetRoot(httpClient, commonB.RDSNumber.Value); } | ||||
|                 catch (Exception) | ||||
|                 { runDataSheetRoot = null; } | ||||
|             } | ||||
|             Qty = "1"; | ||||
|             Status = hyphen; // INFO | ||||
|             CreationUser = hyphen; // ? | ||||
|             LotState = hyphen; // LAYER2 | ||||
|             LastUpdateUser = hyphen; // ? | ||||
|             Equipment = input.MesEntity; // ? | ||||
|             PackageName = hyphen; // WAFER_ID | ||||
|             Qty2 = input.Sequence; // SEQUENCE | ||||
| @ -108,17 +119,39 @@ public partial class Job | ||||
|             IsAreaSi = input.Area == "Si"; // N/A | ||||
|             StateModel = input.EquipmentType; // ? | ||||
|             JobName = DateTime.Ticks.ToString(); // ? | ||||
|             BasicType = GetComment(hyphen, runDataSheetRoot, commonB); // BASIC_TYPE | ||||
|             AutomationMode = string.Concat(DateTime.Ticks, ".", input.MesEntity); // ? | ||||
|             SpecName = !string.IsNullOrEmpty(commonB.Layer) ? commonB.Layer : hyphen; // LAYER | ||||
|             ProductName = !string.IsNullOrEmpty(commonB.PSN) ? commonB.PSN : hyphen; // PRODUCT | ||||
|             ProcessSpecName = !string.IsNullOrEmpty(commonB.Zone) ? commonB.Zone : hyphen; // WAFER_POS | ||||
|             BasicType = !string.IsNullOrEmpty(commonB.Comment) ? commonB.Comment : hyphen; // BASIC_TYPE | ||||
|             LotName = commonB.RDSNumber is not null ? commonB.RDSNumber.Value.ToString() : input.MID; // MID | ||||
|             LastUpdateUser = string.IsNullOrEmpty(runDataSheetRoot?.Json) ? "{}" : runDataSheetRoot.Json; // NULL_DATA | ||||
|             ProcessType = commonB.ReactorNumber is not null ? commonB.ReactorNumber.Value.ToString() : hyphen; // PROCESS_JOBID | ||||
|             Items.Add(new Item { Name = "0", Type = "NA", Number = (0 + 1).ToString(), Qty = "1", CarrierName = hyphen }); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static string GetComment(string hyphen, RunDataSheetRoot? runDataSheetRoot, CommonB commonB) | ||||
|     { | ||||
|         string result; | ||||
|         string? loadLockSide = commonB.LoadLockSide; | ||||
|         if (string.IsNullOrEmpty(loadLockSide) && commonB.RDSNumber is not null) | ||||
|             loadLockSide = runDataSheetRoot?.RunDataSheet?.LoadLockSide; | ||||
|         if (string.IsNullOrEmpty(loadLockSide) || string.IsNullOrEmpty(commonB.ReactorType)) | ||||
|             result = hyphen; | ||||
|         else | ||||
|         { | ||||
|             string loadLockSideFull = loadLockSide switch | ||||
|             { | ||||
|                 "L" => "Left", | ||||
|                 "R" => "Right", | ||||
|                 _ => loadLockSide, | ||||
|             }; | ||||
|             result = $"{loadLockSideFull} - {commonB.ReactorType}"; | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static int? GetReactorNumber(Input input) | ||||
|     { | ||||
|         int? result; | ||||
| @ -239,8 +272,9 @@ public partial class Job | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static Common Get(Input input) | ||||
|     private static Common Get(Input input, HttpClient httpClient) | ||||
|     { | ||||
|         Common result; | ||||
|         string? psn; | ||||
|         string? rds; | ||||
|         int rdsCheck; | ||||
| @ -250,6 +284,7 @@ public partial class Job | ||||
|         string? reactor; | ||||
|         string? employee; | ||||
|         int? reactorNumber; | ||||
|         RunDataSheetRoot? runDataSheetRoot; | ||||
|         string mid = string.IsNullOrEmpty(input.MID) ? string.Empty : input.MID; | ||||
|         if (mid.Length > 2 && mid[0] == '1' && (mid[1] == 'T' || mid[1] == 't')) | ||||
|             mid = mid.Substring(2); | ||||
| @ -259,13 +294,14 @@ public partial class Job | ||||
|         (reactor, rds) = GetReactorAndRDS(input.MID, mid, segments); | ||||
|         rdsNumber = string.IsNullOrEmpty(rds) || !int.TryParse(rds, out rdsCheck) ? null : rdsCheck; | ||||
|         bool isInvalid = IsInvalid(rdsNumber); | ||||
|         if (isInvalid || !int.TryParse(reactor, out int reactorCheck)) | ||||
|         if (rdsNumber is null || isInvalid || !int.TryParse(reactor, out int reactorCheck)) | ||||
|         { | ||||
|             psn = null; | ||||
|             zone = null; | ||||
|             layer = null; | ||||
|             employee = null; | ||||
|             reactorNumber = null; | ||||
|             runDataSheetRoot = null; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
| @ -273,13 +309,17 @@ public partial class Job | ||||
|             reactorNumber = reactorCheck; | ||||
|             (layer, psn) = GetLayerAndPSN(segments); | ||||
|             employee = segments.Length <= 4 ? null : segments[4]; | ||||
|             runDataSheetRoot = GetRunDataSheetRoot(httpClient, rdsNumber.Value); | ||||
|         } | ||||
|         return new(layer: layer, | ||||
|                    psn: psn, | ||||
|                    rdsNumber: rdsNumber, | ||||
|                    reactor: reactorNumber, | ||||
|                    zone: zone, | ||||
|                    employee: employee); | ||||
|         result = new(layer: layer, | ||||
|                      psn: psn, | ||||
|                      rdsNumber: rdsNumber, | ||||
|                      reactor: reactorNumber, | ||||
|                      zone: zone, | ||||
|                      employee: employee, | ||||
|                      runDataSheetRoot: runDataSheetRoot, | ||||
|                      workOrder: null); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static string[] GetDirectories(string fileShare) | ||||
| @ -298,6 +338,7 @@ public partial class Job | ||||
|  | ||||
|     private static Common GetTwoAlphaPattern(string metrologyFileShare, Input input) | ||||
|     { | ||||
|         Common result; | ||||
|         string lines; | ||||
|         const int zero = 0; | ||||
|         string? psn = null; | ||||
| @ -337,12 +378,15 @@ public partial class Job | ||||
|                 zone = workMaterialOut.Zone; | ||||
|             break; | ||||
|         } | ||||
|         return new(layer: layer, | ||||
|                    psn: psn, | ||||
|                    rdsNumber: rdsNumber, | ||||
|                    reactor: reactor, | ||||
|                    zone: zone, | ||||
|                    employee: null); | ||||
|         result = new(layer: layer, | ||||
|                      psn: psn, | ||||
|                      rdsNumber: rdsNumber, | ||||
|                      reactor: reactor, | ||||
|                      zone: zone, | ||||
|                      employee: null, | ||||
|                      runDataSheetRoot: null, | ||||
|                      workOrder: null); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static List<string> GetFiles(Input input, string barcodeHostFileShare) | ||||
| @ -381,84 +425,107 @@ public partial class Job | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static (Common common, WorkOrder workOrder) Get(Input input, HttpClient httpClient) | ||||
|     private static Common ReactorGet(Input input, HttpClient httpClient) | ||||
|     { | ||||
|         int? rds; | ||||
|         string psn; | ||||
|         Common common; | ||||
|         WorkOrder workOrder; | ||||
|         Task<Stream> streamTask; | ||||
|         Task<HttpResponseMessage> httpResponseMessageTask; | ||||
|         string? psn; | ||||
|         Common result; | ||||
|         string mid = string.IsNullOrEmpty(input.MID) ? string.Empty : input.MID; | ||||
|         JsonSerializerOptions jsonSerializerOptions = new() { PropertyNameCaseInsensitive = true }; | ||||
|         int? reactor = mid.Length < 2 || !int.TryParse(mid.Substring(0, 2), out int reactorNumber) ? null : reactorNumber; | ||||
|         httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/reactors/{reactor}"); | ||||
|         httpResponseMessageTask.Wait(); | ||||
|         if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||
|             throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>"); | ||||
|         streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync(); | ||||
|         streamTask.Wait(); | ||||
|         if (!streamTask.Result.CanRead) | ||||
|             throw new NullReferenceException(nameof(streamTask)); | ||||
|         ReactorRoot? reactorRoot = JsonSerializer.Deserialize<ReactorRoot>(streamTask.Result, jsonSerializerOptions); | ||||
|         streamTask.Result.Dispose(); | ||||
|         if (reactorRoot is null || reactor != reactorRoot.Reactor.ReactorNo || reactorRoot.Reactor.LoadedRDS is null || reactorRoot.Reactor.LoadedRDS.Length < 1) | ||||
|         char? loadLockSide = string.IsNullOrEmpty(input.LoadLock) || input.LoadLock[0] is not 'L' and not 'R' ? null : input.LoadLock[0]; | ||||
|         ReactorRoot? reactorRoot = reactor is null || loadLockSide is null ? null : GetReactorRoot(httpClient, jsonSerializerOptions, reactor); | ||||
|         rds = loadLockSide is null ? null : loadLockSide == 'L' ? reactorRoot?.Reactor?.LoadLockLeftRDS : loadLockSide == 'R' ? reactorRoot?.Reactor?.LoadLockRightRDS : null; | ||||
|         if (reactorRoot?.Reactor is null || reactor != reactorRoot.Reactor.ReactorNo || rds is null) | ||||
|         { | ||||
|             rds = null; | ||||
|             psn = string.Empty; | ||||
|             workOrder = new(null, null, null, null, false); | ||||
|             common = new(layer: null, | ||||
|             psn = null; | ||||
|             result = new(layer: null, | ||||
|                          psn: psn, | ||||
|                          rdsNumber: rds, | ||||
|                          reactor: reactor, | ||||
|                          zone: null, | ||||
|                          employee: null); | ||||
|                          employee: null, | ||||
|                          runDataSheetRoot: null, | ||||
|                          workOrder: null); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             rds = reactorRoot.Reactor.LoadedRDS[0]; | ||||
|             workOrder = new(null, null, null, null, false); | ||||
|             httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/materials/rds/{rds}"); | ||||
|             httpResponseMessageTask.Wait(); | ||||
|             if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||
|                 throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>"); | ||||
|             streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync(); | ||||
|             streamTask.Wait(); | ||||
|             if (!streamTask.Result.CanRead) | ||||
|                 throw new NullReferenceException(nameof(streamTask)); | ||||
|             RunDataSheetRoot? runDataSheetRoot = JsonSerializer.Deserialize<RunDataSheetRoot>(streamTask.Result, jsonSerializerOptions); | ||||
|             streamTask.Result.Dispose(); | ||||
|             if (runDataSheetRoot is null || reactor != runDataSheetRoot.RunDataSheet.Reactor) | ||||
|             RunDataSheetRoot? runDataSheetRoot = GetRunDataSheetRoot(httpClient, rds.Value); | ||||
|             if (runDataSheetRoot?.RunDataSheet is null || reactor != runDataSheetRoot.RunDataSheet.Reactor) | ||||
|             { | ||||
|                 psn = string.Empty; | ||||
|                 common = new(layer: null, | ||||
|                 psn = null; | ||||
|                 result = new(layer: null, | ||||
|                              psn: psn, | ||||
|                              rdsNumber: rds, | ||||
|                              reactor: reactor, | ||||
|                              zone: null, | ||||
|                              employee: null); | ||||
|                              employee: null, | ||||
|                              runDataSheetRoot: runDataSheetRoot, | ||||
|                              workOrder: null); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 psn = runDataSheetRoot.RunDataSheet.PSN.ToString(); | ||||
|                 common = new(layer: null, | ||||
|                 result = new(layer: null, | ||||
|                              psn: psn, | ||||
|                              rdsNumber: rds, | ||||
|                              reactor: reactor, | ||||
|                              zone: null, | ||||
|                              employee: null); | ||||
|                              employee: null, | ||||
|                              runDataSheetRoot: runDataSheetRoot, | ||||
|                              workOrder: null); | ||||
|             } | ||||
|         } | ||||
|         return new(common, workOrder); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static (Common common, WorkOrder workOrder) Get(Input input, string barcodeHostFileShare) | ||||
|     private static ReactorRoot? GetReactorRoot(HttpClient httpClient, JsonSerializerOptions jsonSerializerOptions, int? reactor) | ||||
|     { | ||||
|         ReactorRoot? result; | ||||
|         try | ||||
|         { | ||||
|             Task<HttpResponseMessage> httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/reactors/{reactor}"); | ||||
|             httpResponseMessageTask.Wait(); | ||||
|             if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||
|                 throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>"); | ||||
|             using Task<Stream> streamTask = httpResponseMessageTask.Result.Content.ReadAsStreamAsync(); | ||||
|             streamTask.Wait(); | ||||
|             result = !streamTask.Result.CanRead ? null : JsonSerializer.Deserialize<ReactorRoot>(streamTask.Result, jsonSerializerOptions); | ||||
|         } | ||||
|         catch (Exception) { result = null; } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static RunDataSheetRoot? GetRunDataSheetRoot(HttpClient httpClient, int rds) | ||||
|     { | ||||
|         RunDataSheetRoot? result; | ||||
|         try | ||||
|         { | ||||
|             JsonSerializerOptions jsonSerializerOptions = new() { PropertyNameCaseInsensitive = true }; | ||||
|             using Task<HttpResponseMessage> httpResponseMessageTask = httpClient.GetAsync($"{httpClient.BaseAddress}/materials/rds/{rds}"); | ||||
|             httpResponseMessageTask.Wait(); | ||||
|             if (httpResponseMessageTask.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||
|                 throw new Exception($"Unable to OI <{httpResponseMessageTask.Result.StatusCode}>"); | ||||
|             Task<string> json = httpResponseMessageTask.Result.Content.ReadAsStringAsync(); | ||||
|             json.Wait(); | ||||
|             result = JsonSerializer.Deserialize<RunDataSheetRoot>(json.Result, jsonSerializerOptions); | ||||
|             result ??= new RunDataSheetRoot(null); | ||||
|             result.Json = json.Result; | ||||
|         } | ||||
|         catch (Exception) { result = null; } | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     private static Common Get(Input input, string barcodeHostFileShare, HttpClient httpClient) | ||||
|     { | ||||
|         Common result; | ||||
|         if (string.IsNullOrEmpty(barcodeHostFileShare) || !Directory.Exists(barcodeHostFileShare)) | ||||
|             throw new Exception($"Unable to access file-share <{barcodeHostFileShare}>"); | ||||
|         int? rds; | ||||
|         long sequence = 0; | ||||
|         WorkOrder workOrder; | ||||
|         WorkOrder? workOrder; | ||||
|         RunDataSheetRoot? runDataSheetRoot; | ||||
|         string mid = string.IsNullOrEmpty(input.MID) ? string.Empty : input.MID; | ||||
|         int? reactor = mid.Length < 2 || !int.TryParse(mid.Substring(0, 2), out int reactorNumber) ? null : reactorNumber; | ||||
|         bool parsed = !string.IsNullOrEmpty(input.Sequence) && long.TryParse(input.Sequence, out sequence); | ||||
| @ -471,29 +538,32 @@ public partial class Job | ||||
|         if (text is null || text.Length < 3) | ||||
|         { | ||||
|             rds = null; | ||||
|             workOrder = new(null, null, null, null, false); | ||||
|             workOrder = null; | ||||
|             runDataSheetRoot = null; | ||||
|         } | ||||
|         else if (!text.Contains('.')) | ||||
|         { | ||||
|             rds = !int.TryParse(text.Substring(2), out int rdsNumber) ? null : rdsNumber; | ||||
|             workOrder = new(null, null, null, null, false); | ||||
|             workOrder = null; | ||||
|             rds = !int.TryParse(text.Substring(2), out int rdsNumber) || IsInvalid(rdsNumber) ? null : rdsNumber; | ||||
|             runDataSheetRoot = rds is null ? null : GetRunDataSheetRoot(httpClient, rds.Value); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             rds = null; | ||||
|             runDataSheetRoot = null; | ||||
|             workOrder = GetWorkOrder(new(input, text.Substring(2))); | ||||
|         } | ||||
|         Common common = new(layer: null, | ||||
|                             psn: null, | ||||
|                             rdsNumber: rds, | ||||
|                             reactor: reactor, | ||||
|                             zone: null, | ||||
|                             employee: null); | ||||
|         return new(common, workOrder); | ||||
|         result = new(layer: null, | ||||
|                      psn: null, | ||||
|                      rdsNumber: rds, | ||||
|                      reactor: reactor, | ||||
|                      zone: null, | ||||
|                      employee: null, | ||||
|                      runDataSheetRoot: runDataSheetRoot, | ||||
|                      workOrder: workOrder); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| #nullable disable | ||||
|  | ||||
|     private static string GetRunJson(string lsl2SQLConnectionString, string commandText) | ||||
|     { | ||||
|         StringBuilder result = new(); | ||||
| @ -513,7 +583,7 @@ public partial class Job | ||||
|         return result.ToString(); | ||||
|     } | ||||
|  | ||||
|     private static string GetCommandText(int? rds, int? workOrderNumber, int? workOrderCassette, int? slot, int? reactor) | ||||
|     private static string GetCommandText(DateTime enteredDateTimeFilter, DateTime loadSignatureDateTimeFilter, int? rds, int? workOrderNumber, int? workOrderCassette, int? slot, int? reactor) | ||||
|     { // cSpell:disable | ||||
|         List<string> results = new(); | ||||
|         int rdsValue = rds is null ? -1 : rds.Value; | ||||
| @ -540,6 +610,7 @@ public partial class Job | ||||
|         results.Add("       ) zone "); | ||||
|         results.Add(" from lsl2sql.dbo.react_run rr "); | ||||
|         results.Add($" where rr.rds_no = {rdsValue}"); | ||||
|         results.Add($"   and rr.enter_dtm > '{enteredDateTimeFilter:yyyy-MM-dd} 00:00:00.000' "); | ||||
|         results.Add(" union all "); | ||||
|         results.Add(" select "); | ||||
|         results.Add("         rr.rds_no "); | ||||
| @ -589,80 +660,87 @@ public partial class Job | ||||
|         results.Add("   select max(qa.rds_no) "); | ||||
|         results.Add("   from lsl2sql.dbo.react_run qa "); | ||||
|         results.Add("   where qa.load_sig != '' "); | ||||
|         results.Add("       and qa.load_sig_dtm > '2023-05-01 00:00:00.000' "); | ||||
|         results.Add($"       and qa.load_sig_dtm > '{loadSignatureDateTimeFilter:yyyy-MM-dd} 00:00:00.000' "); | ||||
|         results.Add($"       and qa.reactor = {reactorValue}"); | ||||
|         results.Add(" ) "); | ||||
|         results.Add(" for json path "); | ||||
|         return string.Join(Environment.NewLine, results); | ||||
|     } // cSpell:restore | ||||
|  | ||||
|     private static CommonB Get(string lsl2SQLConnectionString, string layer, string psn, int? reactorNumber, int? slotNumber, int? workOrderNumber, int? workOrderCassette, string zone) | ||||
|     private static CommonB Get(string lsl2SQLConnectionString, DateTime enteredDateTimeFilter, DateTime loadSignatureDateTimeFilter, Common common) | ||||
|     { | ||||
|         int? rdsNumber; | ||||
|         string comment; | ||||
|         string? psn; | ||||
|         string? zone; | ||||
|         string? layer; | ||||
|         const int zero = 0; | ||||
|         const string hyphen = "-"; | ||||
|         string commandText = GetCommandText(rds: null, | ||||
|                                             workOrderNumber: workOrderNumber, | ||||
|                                             workOrderCassette: workOrderCassette, | ||||
|                                             slot: slotNumber, | ||||
|                                             reactor: reactorNumber); | ||||
|         int? reactorNumber; | ||||
|         string? reactorType; | ||||
|         string? loadLockSide; | ||||
|         string commandText = GetCommandText(enteredDateTimeFilter, | ||||
|                                             loadSignatureDateTimeFilter, | ||||
|                                             rds: null, | ||||
|                                             workOrderNumber: common.WorkOrder?.WorkOrderNumber, | ||||
|                                             workOrderCassette: common.WorkOrder?.WorkOrderCassette, | ||||
|                                             slot: common.WorkOrder?.SlotNumber, | ||||
|                                             reactor: common.ReactorNumber); | ||||
|         string json = GetRunJson(lsl2SQLConnectionString, commandText); | ||||
|         if (string.IsNullOrEmpty(json)) | ||||
|         { | ||||
|             psn = common.PSN; | ||||
|             rdsNumber = null; | ||||
|             comment = hyphen; | ||||
|             psn = string.Empty; | ||||
|             zone = string.Empty; | ||||
|             reactorType = null; | ||||
|             zone = common.Zone; | ||||
|             loadLockSide = null; | ||||
|             layer = common.Layer; | ||||
|             reactorNumber = common.ReactorNumber; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             Run[] runs; | ||||
|             Run[]? runs; | ||||
|             try | ||||
|             { runs = JsonSerializer.Deserialize<Run[]>(json); } | ||||
|             catch (Exception) | ||||
|             { runs = Array.Empty<Run>(); } | ||||
|             if (runs.Length == 0) | ||||
|             if (runs is null || runs.Length == 0) | ||||
|             { | ||||
|                 psn = common.PSN; | ||||
|                 rdsNumber = null; | ||||
|                 comment = hyphen; | ||||
|                 psn = string.Empty; | ||||
|                 zone = string.Empty; | ||||
|                 reactorType = null; | ||||
|                 zone = common.Zone; | ||||
|                 loadLockSide = null; | ||||
|                 layer = common.Layer; | ||||
|                 reactorNumber = common.ReactorNumber; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 rdsNumber = runs[zero].RdsNo; | ||||
|                 if (string.IsNullOrEmpty(psn)) | ||||
|                     psn = runs[zero].PSN; | ||||
|                 if (string.IsNullOrEmpty(zone)) | ||||
|                     zone = runs[zero].Zone; | ||||
|                 if (string.IsNullOrEmpty(layer)) | ||||
|                     layer = runs[zero].EpiLayer; | ||||
|                 reactorNumber = runs[zero].Reactor; | ||||
|                 string loadLockSide = runs[zero].LoadLockSide; | ||||
|                 string loadLockSideFull = loadLockSide switch | ||||
|                 { | ||||
|                     "L" => "Left", | ||||
|                     "R" => "Right", | ||||
|                     _ => loadLockSide, | ||||
|                 }; | ||||
|                 comment = $"{loadLockSideFull} - {runs[zero].ReactorType}"; | ||||
|                 reactorType = null; | ||||
|                 Run run = runs[zero]; | ||||
|                 rdsNumber = run.RdsNo; | ||||
|                 reactorNumber = run.Reactor; | ||||
|                 loadLockSide = run.LoadLockSide; | ||||
|                 psn = string.IsNullOrEmpty(common.PSN) ? run.PSN : common.PSN; | ||||
|                 zone = string.IsNullOrEmpty(common.Zone) ? run.Zone : common.Zone; | ||||
|                 layer = string.IsNullOrEmpty(common.Layer) ? run.EpiLayer : common.Layer; | ||||
|             } | ||||
|         } | ||||
|         return new(comment: comment, | ||||
|                    layer: layer, | ||||
|         return new(layer: layer, | ||||
|                    loadLockSide: loadLockSide, | ||||
|                    rdsNumber: rdsNumber, | ||||
|                    psn: psn, | ||||
|                    reactorNumber: reactorNumber, | ||||
|                    reactorType: reactorType, | ||||
|                    zone: zone); | ||||
|     } | ||||
|  | ||||
|     private static CommonB GetWithValidRDS(string lsl2SQLConnectionString, string layer, string psn, int? rdsNumber, int? reactorNumber, string zone) | ||||
|     private static CommonB GetWithValidRDS(string lsl2SQLConnectionString, DateTime enteredDateTimeFilter, DateTime loadSignatureDateTimeFilter, string? layer, string? psn, int? rdsNumber, int? reactorNumber, string? zone) | ||||
|     { | ||||
|         string comment; | ||||
|         const int zero = 0; | ||||
|         const string hyphen = "-"; | ||||
|         string commandText = GetCommandText(rds: rdsNumber, | ||||
|         string? reactorType; | ||||
|         string? loadLockSide; | ||||
|         string commandText = GetCommandText(enteredDateTimeFilter, | ||||
|                                             loadSignatureDateTimeFilter, | ||||
|                                             rds: rdsNumber, | ||||
|                                             workOrderNumber: null, | ||||
|                                             workOrderCassette: null, | ||||
|                                             slot: null, | ||||
| @ -670,43 +748,41 @@ public partial class Job | ||||
|         string json = GetRunJson(lsl2SQLConnectionString, commandText); | ||||
|         if (string.IsNullOrEmpty(json)) | ||||
|         { | ||||
|             comment = hyphen; | ||||
|             zone = string.Empty; | ||||
|             zone = null; | ||||
|             reactorType = null; | ||||
|             loadLockSide = null; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             Run[] runs; | ||||
|             Run[]? runs; | ||||
|             try | ||||
|             { runs = JsonSerializer.Deserialize<Run[]>(json); } | ||||
|             catch (Exception) | ||||
|             { runs = Array.Empty<Run>(); } | ||||
|             if (runs.Length == 0) | ||||
|             if (runs is null || runs.Length == 0) | ||||
|             { | ||||
|                 comment = hyphen; | ||||
|                 zone = string.Empty; | ||||
|                 zone = null; | ||||
|                 reactorType = null; | ||||
|                 loadLockSide = null; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 Run run = runs[zero]; | ||||
|                 if (string.IsNullOrEmpty(psn)) | ||||
|                     psn = runs[zero].PSN; | ||||
|                     psn = run.PSN; | ||||
|                 if (string.IsNullOrEmpty(zone)) | ||||
|                     zone = runs[zero].Zone; | ||||
|                     zone = run.Zone; | ||||
|                 if (string.IsNullOrEmpty(layer)) | ||||
|                     layer = runs[zero].EpiLayer; | ||||
|                 reactorNumber = runs[zero].Reactor is null ? reactorNumber : runs[zero].Reactor.Value; | ||||
|                 string loadLockSide = runs[zero].LoadLockSide; | ||||
|                 string loadLockSideFull = loadLockSide switch | ||||
|                 { | ||||
|                     "L" => "Left", | ||||
|                     "R" => "Right", | ||||
|                     _ => loadLockSide, | ||||
|                 }; | ||||
|                 comment = $"{loadLockSideFull} - {runs[zero].ReactorType}"; | ||||
|                     layer = run.EpiLayer; | ||||
|                 reactorNumber = run.Reactor is null ? reactorNumber : run.Reactor.Value; | ||||
|                 loadLockSide = run.LoadLockSide; | ||||
|                 reactorType = run.ReactorType; | ||||
|             } | ||||
|         } | ||||
|         return new(comment: comment, | ||||
|                    layer: layer, | ||||
|         return new(layer: layer, | ||||
|                    loadLockSide: loadLockSide, | ||||
|                    rdsNumber: rdsNumber, | ||||
|                    reactorType: reactorType, | ||||
|                    psn: psn, | ||||
|                    reactorNumber: reactorNumber, | ||||
|                    zone: zone); | ||||
|  | ||||
| @ -167,13 +167,12 @@ internal partial class Main | ||||
|     { | ||||
|         try | ||||
|         { | ||||
|             string mid = string.Empty; | ||||
|             string[] sourceFiles = null; | ||||
|             DateTime dateTime = DateTime.Now; | ||||
|             string pdsfFileLogistics = string.Empty; | ||||
|             IfxDoc envelopeDocument = ifxEnvelope.ExtractDocument(); | ||||
|             CultureInfo cultureInfo = new("en-US"); | ||||
|             string pdsfFileLogistics = string.Empty; | ||||
|             Calendar calendar = cultureInfo.Calendar; | ||||
|             IfxDoc envelopeDocument = ifxEnvelope.ExtractDocument(); | ||||
|             string weekOfYear = calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|             string weekOfYearSegment = string.Concat(@"\", dateTime.ToString("yyyy"), "_Week_", weekOfYear, @"\", dateTime.ToString("yyyy-MM-dd")); | ||||
|             if (!string.IsNullOrEmpty(_FileConnectorConfiguration.SourceFileLocation)) | ||||
| @ -188,8 +187,10 @@ internal partial class Main | ||||
|             } | ||||
|             if (!subject.Contains(_TibcoParameterSubjectPrefix)) | ||||
|                 throw new Exception("Invalid Subject"); | ||||
|             mid = GetJobsMID(envelopeDocument); | ||||
|             Job job = new(_LSL2SQLConnectionString, _MetrologyFileShare, _BarcodeHostFileShare, _HttpClient, mid); | ||||
|             string mid = GetJobsMID(envelopeDocument); | ||||
|             DateTime enteredDateTimeFilter = dateTime.AddDays(-356); | ||||
|             DateTime loadSignatureDateTimeFilter = dateTime.AddDays(-4); | ||||
|             Job job = new(_LSL2SQLConnectionString, _MetrologyFileShare, _BarcodeHostFileShare, _HttpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|             if (job.IsAreaSi) | ||||
|             { | ||||
|                 IfxDoc sendReply = GetJobsReply(job); | ||||
|  | ||||
| @ -6,13 +6,15 @@ public class Reactor | ||||
| { | ||||
|  | ||||
|     [JsonConstructor] | ||||
|     public Reactor(int reactorNo, int[] loadedRDS) | ||||
|     public Reactor(int reactorNo, int? loadLockLeftRDS, int? loadLockRightRDS) | ||||
|     { | ||||
|         LoadLockLeftRDS = loadLockLeftRDS; | ||||
|         LoadLockRightRDS = loadLockRightRDS; | ||||
|         ReactorNo = reactorNo; | ||||
|         LoadedRDS = loadedRDS; | ||||
|     } | ||||
|  | ||||
|     [JsonPropertyName("reactorNo")] public int ReactorNo { get; } // { init; get; } | ||||
|     [JsonPropertyName("loadedRDS")] public int[] LoadedRDS { get; } // { init; get; } | ||||
|     [JsonPropertyName("loadLockLeftRDS")] public int? LoadLockLeftRDS { get; } // { init; get; } | ||||
|     [JsonPropertyName("loadLockRightRDS")] public int? LoadLockRightRDS { get; } // { init; get; } | ||||
|  | ||||
| } | ||||
| @ -2,13 +2,15 @@ using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.TIBCO.Transport; | ||||
|  | ||||
| #nullable enable | ||||
|  | ||||
| public class ReactorRoot | ||||
| { | ||||
|  | ||||
|     [JsonConstructor] | ||||
|     public ReactorRoot(Reactor reactor) => | ||||
|     public ReactorRoot(Reactor? reactor) => | ||||
|         Reactor = reactor; | ||||
|  | ||||
|     [JsonPropertyName("reactor")] public Reactor Reactor { get; } // { init; get; } | ||||
|     [JsonPropertyName("reactor")] public Reactor? Reactor { get; } // { init; get; } | ||||
|  | ||||
| } | ||||
| @ -6,12 +6,14 @@ public class RunDataSheet | ||||
| { | ||||
|  | ||||
|     [JsonConstructor] | ||||
|     public RunDataSheet(int psn, int reactor) | ||||
|     public RunDataSheet(string loadLockSide, int psn, int reactor) | ||||
|     { | ||||
|         PSN = psn; | ||||
|         LoadLockSide = loadLockSide; | ||||
|         Reactor = reactor; | ||||
|     } | ||||
|  | ||||
|     [JsonPropertyName("loadLockSide")] public string LoadLockSide { get; } // { init; get; } | ||||
|     [JsonPropertyName("PSN")] public int PSN { get; } // { init; get; } | ||||
|     [JsonPropertyName("reactor")] public int Reactor { get; } // { init; get; } | ||||
|  | ||||
|  | ||||
| @ -2,13 +2,16 @@ using System.Text.Json.Serialization; | ||||
|  | ||||
| namespace Adaptation.FileHandlers.TIBCO.Transport; | ||||
|  | ||||
| #nullable enable | ||||
|  | ||||
| public class RunDataSheetRoot | ||||
| { | ||||
|  | ||||
|     [JsonConstructor] | ||||
|     public RunDataSheetRoot(RunDataSheet runDataSheet) => | ||||
|     public RunDataSheetRoot(RunDataSheet? runDataSheet) => | ||||
|         RunDataSheet = runDataSheet; | ||||
|  | ||||
|     [JsonPropertyName("rds")] public RunDataSheet RunDataSheet { get; } // { init; get; } | ||||
|     public string? Json { get; set; } | ||||
|     [JsonPropertyName("rds")] public RunDataSheet? RunDataSheet { get; } // { init; get; } | ||||
|  | ||||
| } | ||||
| @ -87,16 +87,16 @@ | ||||
|         </None> | ||||
|     </ItemGroup> | ||||
|     <ItemGroup> | ||||
|         <None Condition="'$(Configuration)' == 'Debug'" Include="\\mestsa003.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6dll64.dll"> | ||||
|         <None Condition="'$(Configuration)' == 'Debug'" Include="D:\EAF-Mesa-Integration\copy\GhostPCL\gpcl6win64\gpcl6dll64.dll"> | ||||
|             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Condition="'$(Configuration)' == 'Debug'" Include="\\mestsa003.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6win64.exe"> | ||||
|         <None Condition="'$(Configuration)' == 'Debug'" Include="D:\EAF-Mesa-Integration\copy\GhostPCL\gpcl6win64\gpcl6win64.exe"> | ||||
|             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Condition="'$(Configuration)' == 'Release'" Include="\\mesfs.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6dll64.dll"> | ||||
|         <None Condition="'$(Configuration)' == 'Release'" Include="D:\EAF-Mesa-Integration\copy\GhostPCL\gpcl6win64\gpcl6dll64.dll"> | ||||
|             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||
|         </None> | ||||
|         <None Condition="'$(Configuration)' == 'Release'" Include="\\mesfs.infineon.com\EC_EAFRepository\Staging\DeploymentStorage\GhostPCL\gpcl6win64\gpcl6win64.exe"> | ||||
|         <None Condition="'$(Configuration)' == 'Release'" Include="D:\EAF-Mesa-Integration\copy\GhostPCL\gpcl6win64\gpcl6win64.exe"> | ||||
|             <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> | ||||
|         </None> | ||||
|     </ItemGroup> | ||||
|  | ||||
| @ -383,17 +383,24 @@ public class FileRead : Properties.IFileRead | ||||
|         else | ||||
|         { | ||||
|             string[] files; | ||||
|             string logisticsSequence = _Logistics.Sequence.ToString(); | ||||
|             string[] directories = Directory.GetDirectories(jobIdDirectory, $"*{logisticsSequence}*", SearchOption.TopDirectoryOnly); | ||||
|             foreach (string directory in directories) | ||||
|             string[] directories; | ||||
|             string logisticsSequence; | ||||
|             for (int i = 0; i < 10; i++) | ||||
|             { | ||||
|                 files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly); | ||||
|                 if (files.Length == 0) | ||||
|                     continue; | ||||
|                 results.Add(directory); | ||||
|                 logisticsSequence = (_Logistics.Sequence + -i).ToString(); | ||||
|                 directories = Directory.GetDirectories(jobIdDirectory, $"*{logisticsSequence}*", SearchOption.TopDirectoryOnly); | ||||
|                 foreach (string directory in directories) | ||||
|                 { | ||||
|                     files = Directory.GetFiles(directory, "*", SearchOption.TopDirectoryOnly); | ||||
|                     if (files.Length == 0) | ||||
|                         continue; | ||||
|                     results.Add(directory); | ||||
|                 } | ||||
|                 if (results.Count == 1) | ||||
|                     break; | ||||
|             } | ||||
|         } | ||||
|         if ((results is null) || results.Count != 1) | ||||
|         if (results.Count != 1) | ||||
|             throw new Exception("Didn't find directory by logistics sequence"); | ||||
|         return results.ToArray(); | ||||
|     } | ||||
| @ -478,27 +485,14 @@ public class FileRead : Properties.IFileRead | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     protected void WritePDSF(IFileRead fileRead, JsonElement[] jsonElements) | ||||
|     protected static void WritePDSF(IFileRead fileRead, JsonElement[] jsonElements) | ||||
|     { | ||||
|         string directory; | ||||
|         string day = $"{_Logistics.DateTimeFromSequence:yyyy-MM-dd}"; | ||||
|         string weekOfYear = _Calendar.GetWeekOfYear(_Logistics.DateTimeFromSequence, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); | ||||
|         string weekDirectory = $"{_Logistics.DateTimeFromSequence:yyyy}_Week_{weekOfYear}"; | ||||
|         if (!_CellInstanceConnectionName.StartsWith(_CellInstanceName) && _CellInstanceConnectionNameBase == _EquipmentType) | ||||
|             directory = Path.Combine(_TracePath, _EquipmentType, "Target", weekDirectory, day, _CellInstanceName, _CellInstanceConnectionName); | ||||
|         else | ||||
|             directory = Path.Combine(_TracePath, _EquipmentType, "Source", weekDirectory, day, _CellInstanceName, _CellInstanceConnectionName); | ||||
|         if (!Directory.Exists(directory)) | ||||
|             _ = Directory.CreateDirectory(directory); | ||||
|         string file = Path.Combine(directory, string.Concat(_Logistics.MesEntity, "_", _Logistics.Sequence, ".ipdsf")); | ||||
|         string lines = ProcessDataStandardFormat.GetPDSFText(fileRead, _Logistics, jsonElements, logisticsText: string.Empty); | ||||
|         File.WriteAllText(file, lines); | ||||
|         if (_Logistics.TotalSecondsSinceLastWriteTimeFromSequence > 600) | ||||
|         { | ||||
|             try | ||||
|             { File.SetLastWriteTime(file, _Logistics.DateTimeFromSequence); } | ||||
|             catch (Exception) { } | ||||
|         } | ||||
| #pragma warning disable CA1510 | ||||
|         if (fileRead is null) | ||||
|             throw new ArgumentNullException(nameof(fileRead)); | ||||
|         if (jsonElements is null) | ||||
|             throw new ArgumentNullException(nameof(jsonElements)); | ||||
| #pragma warning restore CA1510 | ||||
|     } | ||||
|  | ||||
|     protected void WaitForThread(Thread thread, List<Exception> threadExceptions) | ||||
|  | ||||
| @ -2,12 +2,14 @@ using Adaptation.Shared.Methods; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Collections.ObjectModel; | ||||
| using System.Diagnostics; | ||||
| using System.Globalization; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using System.Text.Json; | ||||
| using System.Text.Json.Serialization; | ||||
| using System.Text.RegularExpressions; | ||||
|  | ||||
| namespace Adaptation.Shared; | ||||
|  | ||||
| @ -136,6 +138,7 @@ internal class ProcessDataStandardFormat | ||||
|     internal static ProcessDataStandardFormat GetProcessDataStandardFormat(string reportFullPath, string[]? lines = null, int columnsLine = 6) | ||||
|     { | ||||
|         ProcessDataStandardFormat result; | ||||
|         long? sequence; | ||||
|         string segment; | ||||
|         string[] segments; | ||||
|         bool addToFooter = false; | ||||
| @ -186,13 +189,25 @@ internal class ProcessDataStandardFormat | ||||
|         } | ||||
|         string? linesOne = lines.Length > 0 && body.Count == 0 && columns.Count == 0 ? lines[1] : null; | ||||
|         logistics = GetLogistics(footer, linesOne: linesOne); | ||||
|         if (logistics.Count == 0) | ||||
|             sequence = null; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics[0].Split(new string[] { "SEQUENCE=" }, StringSplitOptions.None); | ||||
|             sequence = segments.Length < 2 || !long.TryParse(segments[1].Split(';')[0], out long s) ? null : s; | ||||
|         } | ||||
|         if (sequence is null && !string.IsNullOrEmpty(reportFullPath)) | ||||
|         { | ||||
|             FileInfo fileInfo = new(reportFullPath); | ||||
|             sequence = fileInfo.LastWriteTime.Ticks; | ||||
|         } | ||||
|         result = new(body: body.AsReadOnly(), | ||||
|                      columns: columns.AsReadOnly(), | ||||
|                      footer: footer.AsReadOnly(), | ||||
|                      header: header.AsReadOnly(), | ||||
|                      inputPDSF: null, | ||||
|                      logistics: logistics, | ||||
|                      sequence: null); | ||||
|                      sequence: sequence); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| @ -214,19 +229,19 @@ internal class ProcessDataStandardFormat | ||||
|         return results.AsReadOnly(); | ||||
|     } | ||||
|  | ||||
|     internal static ProcessDataStandardFormat GetProcessDataStandardFormat(string reportFullPath, ProcessDataStandardFormatMapping pdsfMapping) | ||||
|     internal static ProcessDataStandardFormat GetProcessDataStandardFormat(string reportFullPath, ProcessDataStandardFormatMapping processDataStandardFormatMapping) | ||||
|     { | ||||
|         ProcessDataStandardFormat result; | ||||
|         const int columnsLine = 6; | ||||
|         FileInfo fileInfo = new(reportFullPath); | ||||
|         ProcessDataStandardFormat processDataStandardFormat = GetProcessDataStandardFormat(fileInfo.LastWriteTime, columnsLine, fileInfo.FullName, lines: null); | ||||
|         JsonElement[]? jsonElements = pdsfMapping.OldColumnNames.Count != pdsfMapping.ColumnIndices.Count ? null : GetFullArray(processDataStandardFormat); | ||||
|         JsonElement[]? jsonElements = processDataStandardFormatMapping.OldColumnNames.Count != processDataStandardFormatMapping.ColumnIndices.Count ? null : GetFullArray(processDataStandardFormat); | ||||
|         JsonProperty[]? jsonProperties = jsonElements is null || jsonElements.Length == 0 ? null : jsonElements[0].EnumerateObject().ToArray(); | ||||
|         if (jsonElements is null || jsonProperties is null || jsonProperties.Length != pdsfMapping.NewColumnNames.Count) | ||||
|         if (jsonElements is null || jsonProperties is null || jsonProperties.Length != processDataStandardFormatMapping.NewColumnNames.Count) | ||||
|             result = processDataStandardFormat; | ||||
|         else | ||||
|         { | ||||
|             result = GetProcessDataStandardFormat(pdsfMapping, jsonElements, processDataStandardFormat); | ||||
|             result = GetProcessDataStandardFormat(processDataStandardFormatMapping, jsonElements, processDataStandardFormat); | ||||
|             if (result.Sequence is null || result.Columns.Count == 0 || result.Body.Count == 0 || result.Logistics.Count == 0) | ||||
|                 result = processDataStandardFormat; | ||||
|         } | ||||
| @ -236,7 +251,7 @@ internal class ProcessDataStandardFormat | ||||
|     private static ProcessDataStandardFormat GetProcessDataStandardFormat(DateTime lastWriteTime, int columnsLine, string path, string[]? lines) | ||||
|     { | ||||
|         ProcessDataStandardFormat result; | ||||
|         long sequence; | ||||
|         long? sequence; | ||||
|         string[] segments; | ||||
|         bool addToFooter = false; | ||||
|         List<string> body = new(); | ||||
| @ -268,12 +283,13 @@ internal class ProcessDataStandardFormat | ||||
|         } | ||||
|         logistics = GetLogistics(footer, linesOne: null); | ||||
|         if (logistics.Count == 0) | ||||
|             sequence = lastWriteTime.Ticks; | ||||
|             sequence = null; | ||||
|         else | ||||
|         { | ||||
|             segments = logistics[0].Split(new string[] { "SEQUENCE=" }, StringSplitOptions.None); | ||||
|             sequence = segments.Length < 2 || !long.TryParse(segments[1].Split(';')[0], out long s) ? lastWriteTime.Ticks : s; | ||||
|             sequence = segments.Length < 2 || !long.TryParse(segments[1].Split(';')[0], out long s) ? null : s; | ||||
|         } | ||||
|         sequence ??= lastWriteTime.Ticks; | ||||
|         result = new(body: body.AsReadOnly(), | ||||
|                      columns: new(columns), | ||||
|                      footer: footer.AsReadOnly(), | ||||
| @ -302,7 +318,7 @@ internal class ProcessDataStandardFormat | ||||
|                 segments = bodyLine.Split('\t').ToList(); | ||||
|                 for (int c = 0; c < segments.Count; c++) | ||||
|                 { | ||||
|                     value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); | ||||
|                     value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\""); | ||||
|                     _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\","); | ||||
|                 } | ||||
|                 _ = stringBuilder.Remove(stringBuilder.Length - 1, 1); | ||||
| @ -321,12 +337,14 @@ internal class ProcessDataStandardFormat | ||||
|         int column; | ||||
|         string value; | ||||
|         JsonProperty jsonProperty; | ||||
|         List<string> debug = new(); | ||||
|         List<string> values = new(); | ||||
|         List<string> results = new(); | ||||
|         JsonProperty[] jsonProperties; | ||||
|         List<string> unknownColumns = new(); | ||||
|         for (int i = 0; i < jsonElements.Length; i++) | ||||
|         { | ||||
|             debug.Clear(); | ||||
|             values.Clear(); | ||||
|             if (jsonElements[i].ValueKind != JsonValueKind.Object) | ||||
|             { | ||||
| @ -340,16 +358,22 @@ internal class ProcessDataStandardFormat | ||||
|             { | ||||
|                 column = processDataStandardFormatMapping.ColumnIndices[c]; | ||||
|                 if (column == -1) | ||||
|                 { | ||||
|                     value = processDataStandardFormatMapping.OldColumnNames[c]; | ||||
|                     debug.Add($"<Item C=-01 Name=\"{value}\" DataType=\"8\" XmlType=\"1\" XPath=\"//records/record/{value}\" />"); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     jsonProperty = jsonProperties[column]; | ||||
|                     value = jsonProperty.Value.ToString(); | ||||
|                     debug.Add($"<Item C={column + 2:000} Name=\"{processDataStandardFormatMapping.OldColumnNames[c]}\" DataType=\"8\" XmlType=\"1\" XPath=\"//records/record/{jsonProperty.Name}\" />"); | ||||
|                 } | ||||
|                 values.Add(value); | ||||
|             } | ||||
|             results.Add(string.Join("\t", values)); | ||||
|         } | ||||
|         if (Debugger.IsAttached) | ||||
|             File.WriteAllText("../../.txt", string.Join(Environment.NewLine, debug.OrderBy(l => l))); | ||||
|         result = new(body: new(results), | ||||
|                      columns: processDataStandardFormatMapping.OldColumnNames, | ||||
|                      footer: processDataStandardFormat.Footer, | ||||
| @ -364,7 +388,6 @@ internal class ProcessDataStandardFormat | ||||
|     { | ||||
|         if (processDataStandardFormat.InputPDSF is null) | ||||
|             throw new NullReferenceException(nameof(processDataStandardFormat.InputPDSF)); | ||||
| #pragma warning disable CA1845, IDE0057 | ||||
|         string result; | ||||
|         string line; | ||||
|         string value; | ||||
| @ -378,12 +401,20 @@ internal class ProcessDataStandardFormat | ||||
|                 break; | ||||
|             for (int c = 0; c < segments.Length; c++) | ||||
|             { | ||||
|                 value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); | ||||
|                 value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\""); | ||||
|                 line += string.Concat('"', processDataStandardFormat.InputPDSF.Columns[c].Trim('"'), '"', ':', '"', value, '"', ','); | ||||
|             } | ||||
|             line = string.Concat(line.Substring(0, line.Length - 1), '}'); | ||||
|             lines.Add(line); | ||||
|         } | ||||
|         string? json = null; | ||||
|         if (processDataStandardFormat.Footer is not null && processDataStandardFormat.Footer.Count > 0) | ||||
|         { | ||||
|             Dictionary<string, string> footerKeyValuePairs = GetFooterKeyValuePairs(processDataStandardFormat.Footer); | ||||
|             Dictionary<string, Dictionary<string, string>> logisticKeyValuePairs = GetLogisticKeyValuePairs(processDataStandardFormat.Footer, footerKeyValuePairs); | ||||
|             json = JsonSerializer.Serialize(logisticKeyValuePairs, DictionaryStringDictionaryStringStringSourceGenerationContext.Default.DictionaryStringDictionaryStringString); | ||||
|         } | ||||
|         string footerText = string.IsNullOrEmpty(json) || json == "{}" ? string.Empty : $",{Environment.NewLine}\"PDSF\":{Environment.NewLine}{json}"; | ||||
|         result = string.Concat( | ||||
|             '{', | ||||
|             Environment.NewLine, | ||||
| @ -412,14 +443,92 @@ internal class ProcessDataStandardFormat | ||||
|             ": ", | ||||
|             processDataStandardFormat.Sequence, | ||||
|             Environment.NewLine, | ||||
|             footerText, | ||||
|             Environment.NewLine, | ||||
|             '}'); | ||||
|         return result; | ||||
| #pragma warning restore CA1845, IDE0057 | ||||
|     } | ||||
|  | ||||
|     private static Dictionary<string, string> GetFooterKeyValuePairs(ReadOnlyCollection<string> footerLines) | ||||
|     { | ||||
|         Dictionary<string, string> results = new(); | ||||
|         string[] segments; | ||||
|         foreach (string footerLine in footerLines) | ||||
|         { | ||||
|             segments = footerLine.Split('\t'); | ||||
|             if (segments.Length != 2 || string.IsNullOrEmpty(segments[1].Trim())) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             if (segments[1].Contains(';')) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (results.ContainsKey(segments[0])) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
|                 results.Add(segments[0], segments[1]); | ||||
|             } | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     private static Dictionary<string, Dictionary<string, string>> GetLogisticKeyValuePairs(ReadOnlyCollection<string> footerLines, Dictionary<string, string> footerKeyValuePairs) | ||||
|     { | ||||
|         Dictionary<string, Dictionary<string, string>> results = new(); | ||||
|         string[] segments; | ||||
|         string[] subSegments; | ||||
|         string[] subSubSegments; | ||||
|         Dictionary<string, string>? keyValue; | ||||
|         results.Add("Footer", footerKeyValuePairs); | ||||
|         foreach (string footerLine in footerLines) | ||||
|         { | ||||
|             segments = footerLine.Split('\t'); | ||||
|             if (segments.Length != 2 || string.IsNullOrEmpty(segments[1].Trim())) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             if (!segments[1].Contains(';') || !segments[1].Contains('=')) | ||||
|             { | ||||
|                 continue; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 subSegments = segments[1].Split(';'); | ||||
|                 if (subSegments.Length < 1) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
|                 if (!results.TryGetValue(segments[0], out keyValue)) | ||||
|                 { | ||||
|                     results.Add(segments[0], new()); | ||||
|                     if (!results.TryGetValue(segments[0], out keyValue)) | ||||
|                     { | ||||
|                         throw new Exception(); | ||||
|                     } | ||||
|                 } | ||||
|                 foreach (string segment in subSegments) | ||||
|                 { | ||||
|                     subSubSegments = segment.Split('='); | ||||
|                     if (subSubSegments.Length != 2) | ||||
|                     { | ||||
|                         continue; | ||||
|                     } | ||||
|                     keyValue.Add(subSubSegments[0], subSubSegments[1]); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return results; | ||||
|     } | ||||
|  | ||||
|     internal static void Write(string path, ProcessDataStandardFormat processDataStandardFormat, List<Metrology.WS.Results>? wsResults) | ||||
|     { | ||||
|         List<string> results = new(); | ||||
|         if (processDataStandardFormat.InputPDSF is null) | ||||
|             throw new NullReferenceException(nameof(processDataStandardFormat.InputPDSF)); | ||||
|         if (processDataStandardFormat.Sequence is null) | ||||
|             throw new NullReferenceException(nameof(processDataStandardFormat.Sequence)); | ||||
|         string endOffset = "E#######T"; | ||||
| @ -457,25 +566,25 @@ internal class ProcessDataStandardFormat | ||||
|             } | ||||
|         } | ||||
|         results.Add("END_HEADER"); | ||||
|         if (processDataStandardFormat.InputPDSF is not null) | ||||
|         { | ||||
|             results.Add(string.Empty); | ||||
|             List<char> hyphens = new(); | ||||
|             results.AddRange(processDataStandardFormat.InputPDSF.Header.Select(l => l.Replace('\t', '|'))); | ||||
|             results.Add(string.Empty); | ||||
|             results.Add($"|{string.Join("|", processDataStandardFormat.InputPDSF.Columns)}|"); | ||||
|             for (int i = 0; i < processDataStandardFormat.InputPDSF.Columns.Count; i++) | ||||
|                 hyphens.Add('-'); | ||||
|             results.Add($"|{string.Join("|", hyphens)}|"); | ||||
|             results.AddRange(processDataStandardFormat.InputPDSF.Body.Select(l => l.Replace('\t', '|'))); | ||||
|             results.Add(string.Empty); | ||||
|             results.AddRange(processDataStandardFormat.InputPDSF.Footer.Select(l => l.Replace('\t', '|'))); | ||||
|             results.Add(string.Empty); | ||||
|             results.Add("EOF"); | ||||
|             results.Add(string.Empty); | ||||
|             string json = GetJson(processDataStandardFormat); | ||||
|             results.Add(json); | ||||
|         } | ||||
|         results.Add(string.Empty); | ||||
|         List<char> hyphens = new(); | ||||
|         results.AddRange(processDataStandardFormat.InputPDSF.Header.Select(l => $"|{l.Replace('\t', '|')}|")); | ||||
|         results.Add(string.Empty); | ||||
|         results.Add($"|{string.Join("|", processDataStandardFormat.InputPDSF.Columns)}|"); | ||||
|         for (int i = 0; i < processDataStandardFormat.InputPDSF.Columns.Count; i++) | ||||
|             hyphens.Add('-'); | ||||
|         results.Add($"|{string.Join("|", hyphens)}|"); | ||||
|         results.AddRange(processDataStandardFormat.InputPDSF.Body.Select(l => $"|{l.Replace('\t', '|')}|")); | ||||
|         results.Add(string.Empty); | ||||
|         results.AddRange(processDataStandardFormat.InputPDSF.Footer.Select(l => $"|{l.Replace('\t', '|')}|")); | ||||
|         results.Add(string.Empty); | ||||
|         string xml = GetXml(processDataStandardFormat); | ||||
|         results.Add(xml); | ||||
|         results.Add(string.Empty); | ||||
|         results.Add("EOF"); | ||||
|         results.Add(string.Empty); | ||||
|         string json = GetJson(processDataStandardFormat); | ||||
|         results.Add(json); | ||||
|         File.WriteAllText(path, string.Join(Environment.NewLine, results)); | ||||
|     } | ||||
|  | ||||
| @ -518,7 +627,7 @@ internal class ProcessDataStandardFormat | ||||
|                 { | ||||
|                     for (int c = 1; c < segments.Length; c++) | ||||
|                     { | ||||
|                         value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); | ||||
|                         value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\""); | ||||
|                         _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":\"").Append(value).Append("\","); | ||||
|                     } | ||||
|                 } | ||||
| @ -526,7 +635,7 @@ internal class ProcessDataStandardFormat | ||||
|                 { | ||||
|                     for (int c = 1; c < segments.Length; c++) | ||||
|                     { | ||||
|                         value = segments[c].Replace("\"", "\\\"").Replace("\\", "\\\\"); | ||||
|                         value = segments[c].Replace("\\", "\\\\").Replace("\"", "\\\""); | ||||
|                         if (string.IsNullOrEmpty(value)) | ||||
|                             _ = stringBuilder.Append('"').Append(processDataStandardFormat.Columns[c]).Append("\":").Append(value).Append("null,"); | ||||
|                         else if (value.All(char.IsDigit)) | ||||
| @ -757,6 +866,96 @@ internal class ProcessDataStandardFormat | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     internal static string GetXml(ProcessDataStandardFormat processDataStandardFormat) | ||||
|     { | ||||
|         string result; | ||||
|         string tag; | ||||
|         string value; | ||||
|         string[] segments; | ||||
|         List<string> values; | ||||
|         Dictionary<string, List<string>> results = new(); | ||||
|         ReadOnlyCollection<string> body = processDataStandardFormat.InputPDSF is null ? | ||||
|             processDataStandardFormat.Body : processDataStandardFormat.InputPDSF.Body; | ||||
|         ReadOnlyCollection<string> columns = processDataStandardFormat.InputPDSF is null ? | ||||
|             processDataStandardFormat.Columns : processDataStandardFormat.InputPDSF.Columns; | ||||
|         List<string> lines = new() { "<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "<records>" }; | ||||
|         for (int i = 0; i < body.Count; i++) | ||||
|         { | ||||
|             segments = body[i].Trim().Split('\t'); | ||||
|             if (segments.Length != columns.Count) | ||||
|                 break; | ||||
|             for (int c = 0; c < segments.Length; c++) | ||||
|             { | ||||
|                 value = segments[c].Replace("&", "&") | ||||
|                                    .Replace("<", "<") | ||||
|                                    .Replace(">", ">") | ||||
|                                    .Replace("\"", """) | ||||
|                                    .Replace("'", "'"); | ||||
|                 tag = Regex.Replace(columns[c].Trim('"'), @"[^a-zA-Z0-9]", "_").Split('\r')[0].Split('\n')[0]; | ||||
|                 if (i == 0) | ||||
|                 { | ||||
|                     if (results.ContainsKey(tag)) | ||||
|                         continue; | ||||
|                     results.Add(tag, new List<string>()); | ||||
|                 } | ||||
|                 results[tag].Add(value); | ||||
|             } | ||||
|         } | ||||
|         foreach (KeyValuePair<string, List<string>> keyValuePair in results) | ||||
|         { | ||||
|             if (body.Count < 3) | ||||
|                 break; | ||||
|             if (keyValuePair.Value.Count != body.Count) | ||||
|                 continue; | ||||
|             values = keyValuePair.Value.Distinct().ToList(); | ||||
|             if (values.Count == 2 && (string.IsNullOrEmpty(values[0]) || string.IsNullOrEmpty(values[1]))) | ||||
|             { | ||||
|                 for (int i = 0; i < body.Count; i++) | ||||
|                     keyValuePair.Value[i] = string.Empty; | ||||
|                 foreach (string v in values) | ||||
|                 { | ||||
|                     if (string.IsNullOrEmpty(v)) | ||||
|                         continue; | ||||
|                     keyValuePair.Value[0] = v; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         for (int i = 0; i < body.Count; i++) | ||||
|         { | ||||
|             lines.Add("  <record>"); | ||||
|             foreach (KeyValuePair<string, List<string>> keyValuePair in results) | ||||
|             { | ||||
|                 if (keyValuePair.Value.Count != body.Count) | ||||
|                     continue; | ||||
|                 lines.Add(string.Concat("    <", keyValuePair.Key, '>', keyValuePair.Value[i], "</", keyValuePair.Key, '>')); | ||||
|             } | ||||
|             lines.Add("  </record>"); | ||||
|         } | ||||
|         lines.Add("</records>"); | ||||
|         result = string.Join(Environment.NewLine, lines); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|     internal static string GetXml(string reportFullPath, string[]? lines = null) | ||||
|     { | ||||
|         string result; | ||||
|         bool foundXml = false; | ||||
|         List<string> results = new(); | ||||
|         lines ??= File.ReadAllLines(reportFullPath); | ||||
|         foreach (string line in lines) | ||||
|         { | ||||
|             if (line.StartsWith("<?xml")) | ||||
|                 foundXml = true; | ||||
|             if (!foundXml) | ||||
|                 continue; | ||||
|             if (line.StartsWith("EOF")) | ||||
|                 break; | ||||
|             results.Add(line); | ||||
|         } | ||||
|         result = string.Join(Environment.NewLine, results); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | ||||
| @ -764,3 +963,9 @@ internal class ProcessDataStandardFormat | ||||
| internal partial class JsonElementCollectionSourceGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
|  | ||||
| [JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] | ||||
| [JsonSerializable(typeof(Dictionary<string, Dictionary<string, string>>))] | ||||
| internal partial class DictionaryStringDictionaryStringStringSourceGenerationContext : JsonSerializerContext | ||||
| { | ||||
| } | ||||
| @ -1,33 +1,34 @@ | ||||
| using System.Collections.ObjectModel; | ||||
| using System.Linq; | ||||
|  | ||||
| namespace Adaptation.Shared; | ||||
|  | ||||
| public class ProcessDataStandardFormatMapping | ||||
| { | ||||
|  | ||||
|     public ReadOnlyCollection<string> BackfillColumns { get; private set; } | ||||
|     public ReadOnlyCollection<int> ColumnIndices { get; private set; } | ||||
|     public ReadOnlyCollection<string> IgnoreColumns { get; private set; } | ||||
|     public ReadOnlyCollection<string> IndexOnlyColumns { get; private set; } | ||||
|     public ReadOnlyDictionary<string, string> KeyValuePairs { get; private set; } | ||||
|     public ReadOnlyCollection<string> NewColumnNames { get; private set; } | ||||
|     public ReadOnlyCollection<string> OldColumnNames { get; private set; } | ||||
|  | ||||
|     public ProcessDataStandardFormatMapping(ReadOnlyCollection<string> backfillColumns, | ||||
|                                             ReadOnlyCollection<int> columnIndices, | ||||
|                                             ReadOnlyCollection<string> ignoreColumns, | ||||
|                                             ReadOnlyCollection<string> indexOnlyColumns, | ||||
|                                             ReadOnlyDictionary<string, string> keyValuePairs, | ||||
|     public ProcessDataStandardFormatMapping(ReadOnlyCollection<int> columnIndices, | ||||
|                                             ReadOnlyCollection<string> newColumnNames, | ||||
|                                             ReadOnlyCollection<string> oldColumnNames) | ||||
|     { | ||||
|         BackfillColumns = backfillColumns; | ||||
|         ColumnIndices = columnIndices; | ||||
|         IgnoreColumns = ignoreColumns; | ||||
|         IndexOnlyColumns = indexOnlyColumns; | ||||
|         KeyValuePairs = keyValuePairs; | ||||
|         NewColumnNames = newColumnNames; | ||||
|         OldColumnNames = oldColumnNames; | ||||
|     } | ||||
|  | ||||
|     internal static ProcessDataStandardFormatMapping Get(string processDataStandardFormatMappingOldColumnNames, string processDataStandardFormatMappingNewColumnNames, string processDataStandardFormatMappingColumnIndices) | ||||
|     { | ||||
|         ProcessDataStandardFormatMapping result; | ||||
|         ReadOnlyCollection<string> newColumnNames = new(processDataStandardFormatMappingNewColumnNames.Split(',')); | ||||
|         ReadOnlyCollection<string> oldColumnNames = new(processDataStandardFormatMappingOldColumnNames.Split(',')); | ||||
|         ReadOnlyCollection<int> columnIndices = new(processDataStandardFormatMappingColumnIndices.Split(',').Select(int.Parse).ToArray()); | ||||
|         result = new(columnIndices: columnIndices, | ||||
|                      newColumnNames: newColumnNames, | ||||
|                      oldColumnNames: oldColumnNames); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @ -52,44 +52,57 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     { | ||||
|         string mid; | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"12-123456-1234\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "12-123456-1234", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "21"); | ||||
|         Assert.AreEqual("123456", job.LotName); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "4609"); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"12-1234567-1234\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "12-1234567-1234", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "21"); | ||||
|         Assert.AreEqual("1234567", job.LotName); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "4609"); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"-544481-\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "-544481-", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "51"); | ||||
|         Assert.AreEqual("544481", job.LotName); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); //  == "5158"); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"00-544481-0000\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "00-544481-0000", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "51"); | ||||
|         Assert.AreEqual("544481", job.LotName); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); //  == "5158"); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"00-o171308.1.51-0000\", \"Recipe\": \"Recipe\", \"Slot\": \"11\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "00-o171308.1.51-0000", "Recipe": "Recipe", "Slot": "11"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "54"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); // == "547000"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "4445"); | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE5\", \"Sequence\": \"638163023363575829\", \"MID\": \"B48\", \"Recipe\": \"lsl_6in \"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE5", "Sequence": "638163023363575829", "MID": "B48", "Recipe": "lsl_6in "} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "54"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); // == "547000"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "4445"); | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         NonThrowTryCatch(); | ||||
|     } | ||||
|  | ||||
| @ -99,16 +112,19 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     [TestMethod] | ||||
|     public void TestJobAA() | ||||
|     { | ||||
|         string mid; | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08THFTIRQS408M\", \"MesEntity\": \"BIORAD2\", \"Sequence\": \"123456789\", \"MID\": \"37--\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08THFTIRQS408M", "MesEntity": "BIORAD2", "Sequence": "123456789", "MID": "37--", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.AreEqual("37", job.ProcessType); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); // == "549918"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "5101"); | ||||
| @ -123,14 +139,18 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobB() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         string mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"CDE4\", \"Sequence\": \"123456789\", \"MID\": \"P1234\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE4", "Sequence": "123456789", "MID": "P1234", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -145,14 +165,18 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobC() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         string mid = "{\"Area\": \"Si\", \"EquipmentType\": \"MET08RESIMAPCDE\", \"MesEntity\": \"BIORAD3\", \"Sequence\": \"638234699589174855\", \"MID\": \"33--\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "BIORAD3", "Sequence": "638234699589174855", "MID": "33--", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -167,15 +191,18 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobD() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         string metrologyFileShare = | ||||
|         FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         string mid = "{\"Area\": \"Si\", \"EquipmentType\": \"DEP08CEPIEPSILON\", \"MesEntity\": \"R32\", \"Sequence\": \"\", \"MID\": \"32--\", \"Recipe\": \"Recipe\"}"; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "DEP08CEPIEPSILON", "MesEntity": "R32", "Sequence": "", "MID": "32--", "Recipe": "Recipe"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -191,7 +218,9 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobE() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
| @ -200,7 +229,7 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE5", "Sequence": "638756365880000000", "MID": "38-660275-5095.1", "Recipe": "IRC6mm"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -216,7 +245,9 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobF() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
| @ -225,7 +256,7 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08THFTIRQS408M", "MesEntity": "BIORAD2", "Sequence": "638757112479659597", "MID": "173308.1.5", "Recipe": "6inTHICK"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -241,7 +272,9 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobG() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
| @ -250,7 +283,7 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08DDUPSFS6420", "MesEntity": "TENCOR1", "Sequence": "638765945581765554", "MID": "1T661282", "Recipe": "8IN_THIN ROTR"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -266,7 +299,9 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|     public void TestJobH() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
| @ -275,7 +310,7 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08DDUPSFS6420", "MesEntity": "TENCOR1", "Sequence": "638765945581765554", "MID": "AK1PL2", "Recipe": "8INCLEAN"} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid); | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); | ||||
| @ -284,4 +319,28 @@ public class Job : LoggingUnitTesting, IDisposable | ||||
|         NonThrowTryCatch(); | ||||
|     } | ||||
|  | ||||
|     [TestMethod] | ||||
|     public void TestJobI() | ||||
|     { | ||||
|         FileHandlers.TIBCO.Transport.Job job; | ||||
|         DateTime enteredDateTimeFilter = new(2023, 05, 01); | ||||
|         MethodBase methodBase = new StackFrame().GetMethod(); | ||||
|         DateTime loadSignatureDateTimeFilter = new(2023, 05, 01); | ||||
|         string metrologyFileShare = FileHandlers.TIBCO.FileRead.MetrologyFileShare; | ||||
|         string barcodeHostFileShare = FileHandlers.TIBCO.FileRead.BarcodeHostFileShare; | ||||
|         string lsl2SQLConnectionString = FileHandlers.TIBCO.FileRead.LSL2SQLConnectionString; | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Getting configuration")); | ||||
|         HttpClient httpClient = new() { BaseAddress = new(FileHandlers.TIBCO.FileRead.OpenInsightApplicationProgrammingInterface) }; | ||||
|         string mid = """ | ||||
|         {"Area": "Si", "EquipmentType": "MET08RESIMAPCDE", "MesEntity": "CDE5", "Sequence": "638163023363575829", "MID": "23-111111-5053", "Recipe": "lsl_6in "} | ||||
|         """; | ||||
|         job = new(lsl2SQLConnectionString, metrologyFileShare, barcodeHostFileShare, httpClient, mid, enteredDateTimeFilter, loadSignatureDateTimeFilter); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProcessType)); // == "23"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.LotName)); // == "111111"); | ||||
|         Assert.IsFalse(string.IsNullOrEmpty(job.ProductName)); // == "5053"); | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         LoggingUnitTesting.Logger.LogInformation(string.Concat(methodBase.Name, " - Exit")); | ||||
|         NonThrowTryCatch(); | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										20
									
								
								Adaptation/_Tests/Static/wizard.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								Adaptation/_Tests/Static/wizard.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | ||||
| "use strict"; | ||||
|  | ||||
| const rds = 'http://messa020ec.infineon.com:8080/api/oiWizard/materials/rds/1005602'; | ||||
|  | ||||
| let workItemCollection = []; | ||||
|  | ||||
| await fetch(rds) | ||||
|     .then((res) => res.text()) | ||||
|     .then((text) => { | ||||
|         const records = JSON.parse(text); | ||||
|         if (records != undefined) { | ||||
|             if (records != undefined) { | ||||
|             } | ||||
|         } | ||||
|     }) | ||||
|     .catch((e) => console.error(e)); | ||||
|  | ||||
| workItemCollection.forEach(element => { | ||||
|     console.log(`{"Id": "${element.Id}", "State": "${element.State}", "ClosedDate": "${element.ClosedDate}", "TargetDate": "${element.TargetDate}", "IterationPath": "${element.IterationPath}", "AssignedTo": "${element.AssignedTo}", "Title": "${element.Title}"},`); | ||||
| }); | ||||
							
								
								
									
										76
									
								
								Adaptation/bun.lock
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								Adaptation/bun.lock
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,76 @@ | ||||
| { | ||||
|   "lockfileVersion": 1, | ||||
|   "workspaces": { | ||||
|     "": { | ||||
|       "name": "adaptation", | ||||
|       "devDependencies": { | ||||
|         "@types/bun": "latest", | ||||
|         "axios": "^1.11.0", | ||||
|       }, | ||||
|       "peerDependencies": { | ||||
|         "typescript": "^5", | ||||
|       }, | ||||
|     }, | ||||
|   }, | ||||
|   "packages": { | ||||
|     "@types/bun": ["@types/bun@1.2.19", "", { "dependencies": { "bun-types": "1.2.19" } }, "sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg=="], | ||||
|  | ||||
|     "@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], | ||||
|  | ||||
|     "@types/react": ["@types/react@19.1.9", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-WmdoynAX8Stew/36uTSVMcLJJ1KRh6L3IZRx1PZ7qJtBqT3dYTgyDTx8H1qoRghErydW7xw9mSJ3wS//tCRpFA=="], | ||||
|  | ||||
|     "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], | ||||
|  | ||||
|     "axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], | ||||
|  | ||||
|     "bun-types": ["bun-types@1.2.19", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-uAOTaZSPuYsWIXRpj7o56Let0g/wjihKCkeRqUBhlLVM/Bt+Fj9xTo+LhC1OV1XDaGkz4hNC80et5xgy+9KTHQ=="], | ||||
|  | ||||
|     "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], | ||||
|  | ||||
|     "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], | ||||
|  | ||||
|     "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], | ||||
|  | ||||
|     "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], | ||||
|  | ||||
|     "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], | ||||
|  | ||||
|     "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], | ||||
|  | ||||
|     "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], | ||||
|  | ||||
|     "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], | ||||
|  | ||||
|     "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], | ||||
|  | ||||
|     "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], | ||||
|  | ||||
|     "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], | ||||
|  | ||||
|     "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], | ||||
|  | ||||
|     "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], | ||||
|  | ||||
|     "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], | ||||
|  | ||||
|     "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], | ||||
|  | ||||
|     "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], | ||||
|  | ||||
|     "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], | ||||
|  | ||||
|     "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], | ||||
|  | ||||
|     "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], | ||||
|  | ||||
|     "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], | ||||
|  | ||||
|     "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], | ||||
|  | ||||
|     "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], | ||||
|  | ||||
|     "typescript": ["typescript@5.9.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A=="], | ||||
|  | ||||
|     "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], | ||||
|   } | ||||
| } | ||||
| @ -1,18 +1,29 @@ | ||||
| { | ||||
|     "scripts": { | ||||
|         "AA-CreateSelfDescription.Staging.v2_47_1-SP101_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_47_1 & ClassName~SP101_EQPT\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "BA-CreateSelfDescription.Staging.v2_47_1-SP101": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_47_1 & ClassName~SP101\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "CA-CreateSelfDescription.Staging.v2_47_1-MET08DDUPSP1TBI": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_47_1 & ClassName~MET08DDUPSP1TBI\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "DA-CreateSelfDescription.Staging.v2_47_1": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_47_1\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "EA-Extract.Staging.v2_47_1-SP101_EQPT-Staging__v2_47_1__SP101_EQPT__DownloadRsMFile637953072332628623__Normal": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~SP101_EQPT & Name~Staging__v2_47_1__SP101_EQPT__DownloadRsMFile637953072332628623__Normal\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "FA-Extract.Staging.v2_47_1-SP101-Staging__v2_47_1__SP101__txt637955319879801344__Normal": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~SP101 & Name~Staging__v2_47_1__SP101__txt637955319879801344__Normal\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "GA-Extract.Staging.v2_47_1-MET08DDUPSP1TBI-Staging__v2_47_1__MET08DDUPSP1TBI__MoveMatchingFiles637955319879801344__Normal": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~MET08DDUPSP1TBI & Name~Staging__v2_47_1__MET08DDUPSP1TBI__MoveMatchingFiles637955319879801344__Normal\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "HA-Extract.Staging.v2_47_1-SP101-Staging__v2_47_1__SP101__pcl637812984345592512__MinFileLength": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~SP101 & Name~Staging__v2_47_1__SP101__pcl637812984345592512__MinFileLength\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "HB-Extract.Staging.v2_47_1-MET08DDUPSP1TBI-Staging__v2_47_1__MET08DDUPSP1TBI__OpenInsight638052814829645888__IqsSql": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~MET08DDUPSP1TBI & Name~Staging__v2_47_1__MET08DDUPSP1TBI__OpenInsight638052814829645888__IqsSql\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "IA-Extract.Staging.v2_47_1-MET08DDUPSP1TBI-Staging__v2_47_1__MET08DDUPSP1TBI__TIBCO": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~MET08DDUPSP1TBI & Name~Staging__v2_47_1__MET08DDUPSP1TBI__TIBCO\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|         "Alpha": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", | ||||
|         "kanbn.board": "kanbn board", | ||||
|         "kanbn.board.json": "kanbn board -j > .kanbn/board.json", | ||||
|         "garbage-collect": "git gc" | ||||
|     } | ||||
|   "devDependencies": { | ||||
|     "@types/bun": "latest", | ||||
|     "axios": "^1.11.0" | ||||
|   }, | ||||
|   "module": "index.ts", | ||||
|   "name": "adaptation", | ||||
|   "peerDependencies": { | ||||
|     "typescript": "^5" | ||||
|   }, | ||||
|   "private": true, | ||||
|   "scripts": { | ||||
|     "AA-CreateSelfDescription.Staging.v2_47_1-SP101_EQPT": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_47_1 & ClassName~SP101_EQPT\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "Alpha": "ABCDEFGHIJKLMNOPQRSTUVWXYZ", | ||||
|     "BA-CreateSelfDescription.Staging.v2_47_1-SP101": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_47_1 & ClassName~SP101\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "CA-CreateSelfDescription.Staging.v2_47_1-MET08DDUPSP1TBI": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_47_1 & ClassName~MET08DDUPSP1TBI\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "DA-CreateSelfDescription.Staging.v2_47_1": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.CreateSelfDescription.Staging.v2_47_1\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "EA-Extract.Staging.v2_47_1-SP101_EQPT-Staging__v2_47_1__SP101_EQPT__DownloadRsMFile637953072332628623__Normal": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~SP101_EQPT & Name~Staging__v2_47_1__SP101_EQPT__DownloadRsMFile637953072332628623__Normal\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "FA-Extract.Staging.v2_47_1-SP101-Staging__v2_47_1__SP101__txt637955319879801344__Normal": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~SP101 & Name~Staging__v2_47_1__SP101__txt637955319879801344__Normal\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "GA-Extract.Staging.v2_47_1-MET08DDUPSP1TBI-Staging__v2_47_1__MET08DDUPSP1TBI__MoveMatchingFiles637955319879801344__Normal": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~MET08DDUPSP1TBI & Name~Staging__v2_47_1__MET08DDUPSP1TBI__MoveMatchingFiles637955319879801344__Normal\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "garbage-collect": "git gc", | ||||
|     "HA-Extract.Staging.v2_47_1-SP101-Staging__v2_47_1__SP101__pcl637812984345592512__MinFileLength": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~SP101 & Name~Staging__v2_47_1__SP101__pcl637812984345592512__MinFileLength\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "HB-Extract.Staging.v2_47_1-MET08DDUPSP1TBI-Staging__v2_47_1__MET08DDUPSP1TBI__OpenInsight638052814829645888__IqsSql": "dotnet test --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~MET08DDUPSP1TBI & Name~Staging__v2_47_1__MET08DDUPSP1TBI__OpenInsight638052814829645888__IqsSql\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "IA-Extract.Staging.v2_47_1-MET08DDUPSP1TBI-Staging__v2_47_1__MET08DDUPSP1TBI__TIBCO": "dotnet test --runtime win-x64 --no-build --filter \"FullyQualifiedName~Adaptation._Tests.Extract.Staging.v2_47_1 & ClassName~MET08DDUPSP1TBI & Name~Staging__v2_47_1__MET08DDUPSP1TBI__TIBCO\" -- TestRunParameters.Parameter(name=\\\"WaitFor\\\", value=\\\"Debugger.IsAttached\\\")", | ||||
|     "kanbn.board": "kanbn board", | ||||
|     "kanbn.board.json": "kanbn board -j > .kanbn/board.json" | ||||
|   }, | ||||
|   "type": "module" | ||||
| } | ||||
							
								
								
									
										29
									
								
								Adaptation/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								Adaptation/tsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| { | ||||
|   "compilerOptions": { | ||||
|     // Environment setup & latest features | ||||
|     "lib": ["ESNext"], | ||||
|     "target": "ESNext", | ||||
|     "module": "Preserve", | ||||
|     "moduleDetection": "force", | ||||
|     "jsx": "react-jsx", | ||||
|     "allowJs": true, | ||||
|  | ||||
|     // Bundler mode | ||||
|     "moduleResolution": "bundler", | ||||
|     "allowImportingTsExtensions": true, | ||||
|     "verbatimModuleSyntax": true, | ||||
|     "noEmit": true, | ||||
|  | ||||
|     // Best practices | ||||
|     "strict": true, | ||||
|     "skipLibCheck": true, | ||||
|     "noFallthroughCasesInSwitch": true, | ||||
|     "noUncheckedIndexedAccess": true, | ||||
|     "noImplicitOverride": true, | ||||
|  | ||||
|     // Some stricter flags (disabled by default) | ||||
|     "noUnusedLocals": false, | ||||
|     "noUnusedParameters": false, | ||||
|     "noPropertyAccessFromIndexSignature": false | ||||
|   } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user