Compare commits
	
		
			15 Commits
		
	
	
		
			red-hat
			...
			7b2a843664
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7b2a843664 | |||
| 6f52566fc2 | |||
| 2afb312065 | |||
| 4c2bef71ec | |||
| b824c4ba36 | |||
| 1ad6246b8d | |||
| 478aecf2c8 | |||
| fe3292133e | |||
| e7b721fdb3 | |||
| da3e839a48 | |||
| 6737ddfb59 | |||
| 3aed250488 | |||
| f53ae8c1c8 | |||
| 6317c385f6 | |||
| 5c9f0d1aff | 
| @ -105,7 +105,7 @@ dotnet_diagnostic.CS8936.severity = error # Feature 'collection expressions' is | |||||||
| dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name | 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.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.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.IDE0028.severity = none # IDE0028: Collection initialization can be simplified | ||||||
| dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031) | dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031) | ||||||
| dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed | dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed | ||||||
| @ -115,6 +115,7 @@ dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]cs | |||||||
| dotnet_diagnostic.IDE0300.severity = none # IDE0300: Collection initialization can be simplified | dotnet_diagnostic.IDE0300.severity = none # IDE0300: Collection initialization can be simplified | ||||||
| dotnet_diagnostic.IDE0301.severity = none #IDE0301: 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.IDE0305.severity = none # IDE0305: Collection initialization can be simplified | ||||||
|  | dotnet_diagnostic.MSTEST0015.severity = none # MSTEST0015: Test method {method} should not be ignored | ||||||
| dotnet_naming_rule.abstract_method_should_be_pascal_case.severity = warning | dotnet_naming_rule.abstract_method_should_be_pascal_case.severity = warning | ||||||
| dotnet_naming_rule.abstract_method_should_be_pascal_case.style = pascal_case | dotnet_naming_rule.abstract_method_should_be_pascal_case.style = pascal_case | ||||||
| dotnet_naming_rule.abstract_method_should_be_pascal_case.symbols = abstract_method | dotnet_naming_rule.abstract_method_should_be_pascal_case.symbols = abstract_method | ||||||
|  | |||||||
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -343,4 +343,6 @@ ASALocalRun/ | |||||||
| /wwwroot/lib/* | /wwwroot/lib/* | ||||||
|  |  | ||||||
| .kanbn | .kanbn | ||||||
| Tests/.kanbn | Tests/.kanbn | ||||||
|  |  | ||||||
|  | secrets.json | ||||||
							
								
								
									
										6
									
								
								.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -8,7 +8,7 @@ | |||||||
|             "name": ".NET Core Launch (web) - Server", |             "name": ".NET Core Launch (web) - Server", | ||||||
|             "type": "coreclr", |             "type": "coreclr", | ||||||
|             "request": "launch", |             "request": "launch", | ||||||
|             "preLaunchTask": "buildServer", |             "preLaunchTask": "Build Server", | ||||||
|             // If you have changed target frameworks, make sure to update the program path. |             // If you have changed target frameworks, make sure to update the program path. | ||||||
|             "program": "${workspaceFolder}/Server/bin/Debug/net8.0/win-x64/OI.Metrology.Server.dll", |             "program": "${workspaceFolder}/Server/bin/Debug/net8.0/win-x64/OI.Metrology.Server.dll", | ||||||
|             "args": [], |             "args": [], | ||||||
| @ -31,7 +31,7 @@ | |||||||
|             "name": ".NET Core Attach - Server", |             "name": ".NET Core Attach - Server", | ||||||
|             "type": "coreclr", |             "type": "coreclr", | ||||||
|             "request": "attach", |             "request": "attach", | ||||||
|             "preLaunchTask": "watchServer", |             "preLaunchTask": "Watch Server", | ||||||
|             "processName": "OI.Metrology.Server.exe" |             "processName": "OI.Metrology.Server.exe" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
| @ -41,7 +41,7 @@ | |||||||
|             "name": ".NET Core Launch (web) - ClientHub", |             "name": ".NET Core Launch (web) - ClientHub", | ||||||
|             "type": "coreclr", |             "type": "coreclr", | ||||||
|             "request": "launch", |             "request": "launch", | ||||||
|             "preLaunchTask": "buildClientHub", |             "preLaunchTask": "Build Client Hub", | ||||||
|             // If you have changed target frameworks, make sure to update the program path. |             // If you have changed target frameworks, make sure to update the program path. | ||||||
|             "program": "${workspaceFolder}/ClientHub/bin/Debug/net7.0/win-x64/OI.Metrology.ClientHub.dll", |             "program": "${workspaceFolder}/ClientHub/bin/Debug/net7.0/win-x64/OI.Metrology.ClientHub.dll", | ||||||
|             "args": [], |             "args": [], | ||||||
|  | |||||||
							
								
								
									
										58
									
								
								.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -28,72 +28,60 @@ | |||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "buildServer", |             "label": "Build Server", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "build", |                 "build", | ||||||
|                 "${workspaceFolder}/Server/OI.Metrology.Server.csproj", |                 "${workspaceFolder}/Server/OI.Metrology.Server.csproj" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "buildTests", |             "label": "Build Tests", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "build", |                 "build", | ||||||
|                 "${workspaceFolder}/Tests/OI.Metrology.Tests.csproj", |                 "${workspaceFolder}/Tests/OI.Metrology.Tests.csproj" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "buildShared", |             "label": "Build Shared", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "build", |                 "build", | ||||||
|                 "${workspaceFolder}/Shared/OI.Metrology.Shared.csproj", |                 "${workspaceFolder}/Shared/OI.Metrology.Shared.csproj" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "publishServer", |             "label": "Publish Server", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "publish", |                 "publish", | ||||||
|                 "${workspaceFolder}/Server/OI.Metrology.Server.csproj", |                 "${workspaceFolder}/Server/OI.Metrology.Server.csproj" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "testDebug", |             "label": "Test Debug", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "test", |                 "test" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "testRelease", |             "label": "Test Release", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "test", |                 "test", | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary", |  | ||||||
|                 "-c", |                 "-c", | ||||||
|                 "Release" |                 "Release" | ||||||
|             ], |             ], | ||||||
| @ -115,7 +103,7 @@ | |||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "old-watch", |             "label": "Old Watch", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
| @ -127,7 +115,7 @@ | |||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "watchServer", |             "label": "Watch Server", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
| @ -161,31 +149,27 @@ | |||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "buildClientHub", |             "label": "Build Client Hub", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "build", |                 "build", | ||||||
|                 "${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj", |                 "${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "publishClientHub", |             "label": "Publish Client Hub", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "publish", |                 "publish", | ||||||
|                 "${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj", |                 "${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "watchClientHub", |             "label": "Watch Client Hub", | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
| @ -217,12 +201,6 @@ | |||||||
|                     "endsPattern": "^.*Application started.*" |                     "endsPattern": "^.*Application started.*" | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|             "label": "File-Folder-Helper AOT s M Self .Kanbn Tasks", |  | ||||||
|             "type": "shell", |  | ||||||
|             "command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s M '.kanbn/tasks'", |  | ||||||
|             "problemMatcher": [] |  | ||||||
|         } |         } | ||||||
|     ] |     ] | ||||||
| } | } | ||||||
							
								
								
									
										8
									
								
								Archive/.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -7,9 +7,7 @@ | |||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "build", |                 "build", | ||||||
|                 "${workspaceFolder}/Archive.csproj", |                 "${workspaceFolder}/Archive.csproj" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
| @ -19,9 +17,7 @@ | |||||||
|             "type": "process", |             "type": "process", | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "publish", |                 "publish", | ||||||
|                 "${workspaceFolder}/Archive.csproj", |                 "${workspaceFolder}/Archive.csproj" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "problemMatcher": "$msCompile" | ||||||
|         }, |         }, | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								Server/.vscode/launch.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -8,7 +8,7 @@ | |||||||
|             "name": ".NET Core Launch (web)", |             "name": ".NET Core Launch (web)", | ||||||
|             "type": "coreclr", |             "type": "coreclr", | ||||||
|             "request": "launch", |             "request": "launch", | ||||||
|             "preLaunchTask": "build", |             "preLaunchTask": "Build", | ||||||
|             // If you have changed target frameworks, make sure to update the program path. |             // If you have changed target frameworks, make sure to update the program path. | ||||||
|             "program": "${workspaceFolder}/bin/Debug/net8.0/OI.Metrology.Server.dll", |             "program": "${workspaceFolder}/bin/Debug/net8.0/OI.Metrology.Server.dll", | ||||||
|             "args": [], |             "args": [], | ||||||
|  | |||||||
							
								
								
									
										5
									
								
								Server/.vscode/mklink.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,5 @@ | |||||||
|  | # mklink | ||||||
|  |  | ||||||
|  | ```bash Thu Aug 29 2024 09:47:22 GMT-0700 (Mountain Standard Time) | ||||||
|  | mklink /J "L:\DevOps\OpenInsight-Metrology-Viewer\OI-Metrology\Server\.vscode\.UserSecrets" "C:\Users\phares\AppData\Roaming\Microsoft\UserSecrets\b0a3891c-b775-422c-80ee-63a2f385045d" | ||||||
|  | ``` | ||||||
							
								
								
									
										486
									
								
								Server/.vscode/tasks.json
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,22 +1,164 @@ | |||||||
| { | { | ||||||
|     "version": "2.0.0", |     "inputs": [ | ||||||
|     "tasks": [ |  | ||||||
|         { |         { | ||||||
|             "label": "build", |             "default": "Development", | ||||||
|             "command": "dotnet", |             "description": "Which ASP Net Core Environment?", | ||||||
|             "type": "process", |             "id": "ASPNETCORE_ENVIRONMENT", | ||||||
|             "args": [ |             "options": [ | ||||||
|                 "build", |                 "Development", | ||||||
|                 "${workspaceFolder}/OI.Metrology.Server.csproj", |                 "Production" | ||||||
|                 "/property:GenerateFullPaths=true", |  | ||||||
|                 "/consoleloggerparameters:NoSummary" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "type": "pickString" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "Format", |             "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": [ | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "build" | ||||||
|  |             ], | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "label": "Build", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "build", | ||||||
|  |                 "${workspaceFolder}/../Tests/OI.Metrology.Tests.csproj" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "Build Tests", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "test", | ||||||
|  |                 "${workspaceFolder}/../Tests/OI.Metrology.Tests.csproj" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "Test Debug", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "test", | ||||||
|  |                 "${workspaceFolder}/../Tests/OI.Metrology.Tests.csproj", | ||||||
|  |                 "-c", | ||||||
|  |                 "Release" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "Test Release", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "format", |                 "format", | ||||||
|                 "--report", |                 "--report", | ||||||
| @ -26,71 +168,321 @@ | |||||||
|                 "--severity", |                 "--severity", | ||||||
|                 "warn" |                 "warn" | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "command": "dotnet", | ||||||
|  |             "label": "Format", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "publish", |             "args": [ | ||||||
|  |                 "format", | ||||||
|  |                 "whitespace" | ||||||
|  |             ], | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "label": "Format Whitespace", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "publish", |                 "publish", | ||||||
|                 "${workspaceFolder}/OI.Metrology.Server.csproj", |                 "--configuration", | ||||||
|                 "/property:GenerateFullPaths=true", |                 "Release", | ||||||
|                 "/consoleloggerparameters:NoSummary" |                 "--runtime", | ||||||
|  |                 "win-x64", | ||||||
|  |                 "--self-contained", | ||||||
|  |                 "-o", | ||||||
|  |                 "D:/web-sites/OI-Metrology/hh-3498d1da-_______-OI-Metrology-Release/Server" | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "command": "dotnet", | ||||||
|  |             "label": "Publish", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "old-watch", |             "args": [ | ||||||
|  |                 "publish", | ||||||
|  |                 "--configuration", | ||||||
|  |                 "Release", | ||||||
|  |                 "--runtime", | ||||||
|  |                 "win-x64", | ||||||
|  |                 "-p:PublishAot=true", | ||||||
|  |                 "/property:GenerateFullPaths=true" | ||||||
|  |             ], | ||||||
|             "command": "dotnet", |             "command": "dotnet", | ||||||
|             "type": "process", |             "label": "Publish AOT", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "watch", |                 "watch", | ||||||
|                 "run", |                 "run" | ||||||
|                 "--project", |  | ||||||
|                 "${workspaceFolder}/OI.Metrology.Server.csproj" |  | ||||||
|             ], |             ], | ||||||
|             "problemMatcher": "$msCompile" |             "command": "dotnet", | ||||||
|  |             "label": "Old Watch", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "watch", |  | ||||||
|             "command": "dotnet", |  | ||||||
|             "type": "process", |  | ||||||
|             "args": [ |             "args": [ | ||||||
|                 "watch", |                 "watch", | ||||||
|                 "--launch-profile", |                 "--launch-profile", | ||||||
|                 "http", |                 "http", | ||||||
|                 "run", |                 "run", | ||||||
|                 "--project", |  | ||||||
|                 "${workspaceFolder}/OI.Metrology.Server.csproj", |  | ||||||
|                 "--verbose" |                 "--verbose" | ||||||
|             ], |             ], | ||||||
|             "isBackground": true, |             "command": "dotnet", | ||||||
|             "dependsOn": [ |             "dependsOn": [ | ||||||
|                 "build" |                 "build" | ||||||
|             ], |             ], | ||||||
|  |             "isBackground": true, | ||||||
|  |             "label": "Watch", | ||||||
|             "problemMatcher": { |             "problemMatcher": { | ||||||
|                 "fileLocation": "relative", |  | ||||||
|                 "pattern": { |  | ||||||
|                     "regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$", |  | ||||||
|                     "file": 1, |  | ||||||
|                     "location": 2, |  | ||||||
|                     "severity": 3, |  | ||||||
|                     "code": 4, |  | ||||||
|                     "message": 5 |  | ||||||
|                 }, |  | ||||||
|                 "background": { |                 "background": { | ||||||
|                     "activeOnStart": true, |                     "activeOnStart": true, | ||||||
|                     "beginsPattern": "^.*Shutdown requested.*", |                     "beginsPattern": "^.*Shutdown requested.*", | ||||||
|                     "endsPattern": "^.*Application started.*" |                     "endsPattern": "^.*Application started.*" | ||||||
|  |                 }, | ||||||
|  |                 "fileLocation": "relative", | ||||||
|  |                 "pattern": { | ||||||
|  |                     "code": 4, | ||||||
|  |                     "file": 1, | ||||||
|  |                     "location": 2, | ||||||
|  |                     "message": 5, | ||||||
|  |                     "regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$", | ||||||
|  |                     "severity": 3 | ||||||
|                 } |                 } | ||||||
|             } |             }, | ||||||
|  |             "type": "process" | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|             "label": "File-Folder-Helper AOT s V Repositories", |             "args": [ | ||||||
|             "type": "shell", |                 "s", | ||||||
|             "command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s V Repositories", |                 "X", | ||||||
|             "problemMatcher": [] |                 "L:/DevOps/Mesa_FI/OI-Metrology Day-Helper-2024-01-08 L:/DevOps/Mesa_FI/OI-Metrology/Server" | ||||||
|  |             ], | ||||||
|  |             "command": "L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net8.0/win-x64/publish/File-Folder-Helper.exe", | ||||||
|  |             "label": "File-Folder-Helper AOT s X Server", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "echo Assembly Title: ${input:AssemblyTitle} & echo Build Id: ${input:Build.BuildId} & echo Build Reason: ${input:Build.Reason} & echo Repo Id: ${input:Build.Repository.Id} & echo Repo Name: ${input:Build.Repository.Name} & echo Source Version: ${input:Build.SourceVersion} & echo Configuration: ${input:Configuration} & echo Core Version: ${input:CoreVersion} & echo Nuget Source: ${input:NugetSource} & echo Runtime: ${input:Runtime}", | ||||||
|  |             "label": "Echo Check", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "dotnet user-secrets init & dotnet user-secrets set BuildNumber ${input:Build.BuildId} & dotnet user-secrets set GitCommit ${input:Build.SourceVersion} & dotnet user-secrets list", | ||||||
|  |             "label": "App - Safe storage of app secrets", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "build", | ||||||
|  |                 "--configuration", | ||||||
|  |                 "${input:Configuration}", | ||||||
|  |                 "--source", | ||||||
|  |                 "${input:NugetSource}" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "App - Build", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "build", | ||||||
|  |                 "${workspaceFolder}/../Tests/OI.Metrology.Tests.csproj", | ||||||
|  |                 "--configuration", | ||||||
|  |                 "${input:Configuration}", | ||||||
|  |                 "--source", | ||||||
|  |                 "${input:NugetSource}" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "Tests - Build", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "test", | ||||||
|  |                 "${workspaceFolder}/../Tests/OI.Metrology.Tests.csproj", | ||||||
|  |                 "--configuration", | ||||||
|  |                 "${input:Configuration}" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "Tests - Test", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "publish", | ||||||
|  |                 "--configuration", | ||||||
|  |                 "${input:Configuration}", | ||||||
|  |                 "--runtime", | ||||||
|  |                 "${input:Runtime}", | ||||||
|  |                 "--self-contained" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "App - Publish", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "publish", | ||||||
|  |                 "--configuration", | ||||||
|  |                 "${input:Configuration}", | ||||||
|  |                 "--runtime", | ||||||
|  |                 "${input:Runtime}", | ||||||
|  |                 "-p:PublishAot=true" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "App - AOT Publish", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "(robocopy /MIR \"bin/${input:Configuration}/${input:CoreVersion}/${input:Runtime}/publish\" \"D:/${input:CoreVersion}/${input:Runtime}/${input:Build.Repository.Name}/${input:Configuration}/${input:Build.BuildId}/${input:AssemblyTitle}\") ^& IF %ERRORLEVEL% LEQ 7 exit 0", | ||||||
|  |             "label": "Copy Files to: D:/", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "tool", | ||||||
|  |                 "restore" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "Tool Restore", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "ReportGenerator", | ||||||
|  |                 "-reports:${input:System.DefaultWorkingDirectory}/TestResults/**/coverage.cobertura.xml", | ||||||
|  |                 "-targetDir:${input:Build.ArtifactStagingDirectory}/Coverage", | ||||||
|  |                 "-reportTypes:Html_Dark" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "Report Generator", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "clean", | ||||||
|  |                 "${workspaceFolder}/../Tests/OI.Metrology.Tests.csproj", | ||||||
|  |                 "--configuration", | ||||||
|  |                 "${input:Configuration}" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "Tests - Clean", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "clean", | ||||||
|  |                 "--configuration", | ||||||
|  |                 "${input:Configuration}" | ||||||
|  |             ], | ||||||
|  |             "command": "dotnet", | ||||||
|  |             "label": "App - Clean", | ||||||
|  |             "problemMatcher": "$msCompile", | ||||||
|  |             "type": "process" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "C:/Windows/system32/inetsrv/appcmd.exe stop apppool /apppool.name:${input:AssemblyTitle}.${input:Configuration} & exit 0", | ||||||
|  |             "label": "Stop Pool", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "C:/Windows/system32/inetsrv/appcmd.exe stop site /site.name:${input:AssemblyTitle}.${input:Configuration} & exit 0", | ||||||
|  |             "label": "Stop Website", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "rmdir D:/web-sites/${input:AssemblyTitle}.${input:Configuration} & exit 0", | ||||||
|  |             "label": "Remove MKLink", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "mklink /J \"D:\\web-sites\\${input:AssemblyTitle}.${input:Configuration}\" \"D:\\$(CoreVersion)\\$(Runtime)\\$(Build.Repository.Name)\\$(Configuration)\\$(Build.BuildId)\\$(AssemblyTitle)\"", | ||||||
|  |             "label": "Create MKLink", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "mkdir D:/web-sites/${input:AssemblyTitle}.${input:Configuration}/${input:AssemblyTitle}.${input:Configuration} & exit 0", | ||||||
|  |             "label": "Make Directory", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "(robocopy /IS /IT /IM \"%USERPROFILE%/AppData/Roaming/Microsoft/UserSecrets/$(UserSecretsId)\" \"D:/$(CoreVersion)/$(Runtime)/$(Build.Repository.Name)/$(Configuration)/$(Build.BuildId)/$(AssemblyTitle)\" secrets.json) ^& IF %ERRORLEVEL% LEQ 7 exit 0", | ||||||
|  |             "label": "Replace User Secrets Id File", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "(robocopy /IS /IT /IM \"%USERPROFILE%/AppData/Roaming/Microsoft/UserSecrets/$(UserSecretsId)\" \"D:/$(CoreVersion)/$(Runtime)/$(Build.Repository.Name)/$(Configuration)/$(Build.BuildId)/$(AssemblyTitle)\" web.config) ^& IF %ERRORLEVEL% LEQ 7 exit 0", | ||||||
|  |             "label": "Replace Web Configuration File", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "C:/Windows/system32/inetsrv/appcmd.exe start apppool /apppool.name:${input:AssemblyTitle}.${input:Configuration}", | ||||||
|  |             "label": "Start Pool", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "command": "C:/Windows/system32/inetsrv/appcmd.exe start site /site.name:${input:AssemblyTitle}.${input:Configuration}", | ||||||
|  |             "label": "Start Website", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "args": [ | ||||||
|  |                 "App - AOT Publish", | ||||||
|  |                 "Tool Restore", | ||||||
|  |                 "Report Generator" | ||||||
|  |             ], | ||||||
|  |             "command": "echo", | ||||||
|  |             "dependsOn": [ | ||||||
|  |                 "Echo Check", | ||||||
|  |                 "App - Safe storage of app secrets", | ||||||
|  |                 "App - Build", | ||||||
|  |                 "Tests - Build", | ||||||
|  |                 "Tests - Test", | ||||||
|  |                 "App - Publish", | ||||||
|  |                 "Copy Files to: D:/", | ||||||
|  |                 "Tests - Clean", | ||||||
|  |                 "App - Clean", | ||||||
|  |                 "Stop Pool", | ||||||
|  |                 "Stop Website", | ||||||
|  |                 "Remove MKLink", | ||||||
|  |                 "Create MKLink", | ||||||
|  |                 "Make Directory", | ||||||
|  |                 "Replace User Secrets Id File", | ||||||
|  |                 "Replace Web Configuration File", | ||||||
|  |                 "Start Pool", | ||||||
|  |                 "Start Website" | ||||||
|  |             ], | ||||||
|  |             "dependsOrder": "sequence", | ||||||
|  |             "label": "Pipeline", | ||||||
|  |             "problemMatcher": [], | ||||||
|  |             "type": "shell" | ||||||
|         } |         } | ||||||
|     ] |     ], | ||||||
|  |     "version": "2.0.0" | ||||||
| } | } | ||||||
| @ -1,4 +1,5 @@ | |||||||
| using Microsoft.AspNetCore.Mvc; | using Microsoft.AspNetCore.Mvc; | ||||||
|  | using OI.Metrology.Server.Models; | ||||||
| using OI.Metrology.Shared.Models.Stateless; | using OI.Metrology.Shared.Models.Stateless; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.ApiControllers; | namespace OI.Metrology.Server.ApiControllers; | ||||||
| @ -8,9 +9,9 @@ namespace OI.Metrology.Server.ApiControllers; | |||||||
| public class AppSettingsController : ControllerBase, IAppSettingsController<ActionResult> | public class AppSettingsController : ControllerBase, IAppSettingsController<ActionResult> | ||||||
| { | { | ||||||
|  |  | ||||||
|     private readonly IAppSettingsRepository<Models.Binder.AppSettings> _AppSettingsRepository; |     private readonly IAppSettingsRepository<AppSettings> _AppSettingsRepository; | ||||||
|  |  | ||||||
|     public AppSettingsController(IAppSettingsRepository<Models.Binder.AppSettings> AppSettingsRepository) => _AppSettingsRepository = AppSettingsRepository; |     public AppSettingsController(IAppSettingsRepository<AppSettings> AppSettingsRepository) => _AppSettingsRepository = AppSettingsRepository; | ||||||
|  |  | ||||||
|     [HttpGet(nameof(IAppSettingsController<ActionResult>.Action.App))] |     [HttpGet(nameof(IAppSettingsController<ActionResult>.Action.App))] | ||||||
|     public ActionResult GetAppSettings() => |     public ActionResult GetAppSettings() => | ||||||
|  | |||||||
| @ -38,4 +38,10 @@ public class AwaitingDispoController : Controller, IAwaitingDispoController<IAct | |||||||
|         else |         else | ||||||
|             return StatusCode(444); |             return StatusCode(444); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     // this endpoint is used to clear the ReviewDate column, causing the header to show up again | ||||||
|  |     [HttpGet("/api/awaitingdispo/{toolTypeId}/header-attachment-id")] | ||||||
|  |     public IActionResult GetHeaderAttachmentID(int toolTypeId, [FromQuery] long headerid) => | ||||||
|  |         Content(_MetrologyRepository.GetHeaderAttachmentID(toolTypeId, headerid).ToString()); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -4,6 +4,7 @@ namespace OI.Metrology.Server.ApiControllers; | |||||||
|  |  | ||||||
| using OI.Metrology.Shared.DataModels; | using OI.Metrology.Shared.DataModels; | ||||||
| using OI.Metrology.Shared.Models.Stateless; | using OI.Metrology.Shared.Models.Stateless; | ||||||
|  | using System.Data; | ||||||
| using System.Text.Json; | using System.Text.Json; | ||||||
|  |  | ||||||
| [Route("api/[controller]")] | [Route("api/[controller]")] | ||||||
| @ -11,9 +12,13 @@ public class ExportController : Controller, IExportController<IActionResult> | |||||||
| { | { | ||||||
|  |  | ||||||
|     private readonly IExportRepository _ExportRepository; |     private readonly IExportRepository _ExportRepository; | ||||||
|  |     private readonly IMetrologyRepository _MetrologyRepository; | ||||||
|  |  | ||||||
|     public ExportController(IExportRepository exportRepository) => |     public ExportController(IExportRepository exportRepository, IMetrologyRepository metrologyRepository) | ||||||
|  |     { | ||||||
|         _ExportRepository = exportRepository; |         _ExportRepository = exportRepository; | ||||||
|  |         _MetrologyRepository = metrologyRepository; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     private static string? GetJson(Stream stream) |     private static string? GetJson(Stream stream) | ||||||
|     { |     { | ||||||
| @ -79,4 +84,21 @@ public class ExportController : Controller, IExportController<IActionResult> | |||||||
|     public IActionResult PostProcessDataStandardFormat() => |     public IActionResult PostProcessDataStandardFormat() => | ||||||
|         Content(_ExportRepository.GetProcessDataStandardFormat(GetHeaderCommon(Request.Body))); |         Content(_ExportRepository.GetProcessDataStandardFormat(GetHeaderCommon(Request.Body))); | ||||||
|  |  | ||||||
|  |     [HttpGet] | ||||||
|  |     [Route("{toolTypeId}/export")] | ||||||
|  |     public IActionResult GetExportData(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend) | ||||||
|  |     { | ||||||
|  |         Result<DataTable> r = _ExportRepository.GetExportData(_MetrologyRepository, toolTypeId, datebegin, dateend); | ||||||
|  |         string json = Newtonsoft.Json.JsonConvert.SerializeObject(r); | ||||||
|  |         return Content(json); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     [HttpGet] | ||||||
|  |     [Route("{toolTypeId}/csv")] | ||||||
|  |     public IActionResult GetCSVExport(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] string? filename) | ||||||
|  |     { | ||||||
|  |         string r = _ExportRepository.GetCSVExport(_MetrologyRepository, toolTypeId, datebegin, dateend); | ||||||
|  |         return Content(r); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -22,7 +22,7 @@ public class FileShareController : Controller, IFileShareController<IResult> | |||||||
|     [HttpGet("move-file")] |     [HttpGet("move-file")] | ||||||
|     public IResult MoveFile(string from, string to) |     public IResult MoveFile(string from, string to) | ||||||
|     { |     { | ||||||
|         _FileShareRepository.CopyFile(from, to); |         _FileShareRepository.MoveFile(from, to); | ||||||
|         return Results.Ok(); |         return Results.Ok(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ using OI.Metrology.Shared.Models; | |||||||
| using OI.Metrology.Shared.Models.Stateless; | using OI.Metrology.Shared.Models.Stateless; | ||||||
| using OI.Metrology.Shared.Services; | using OI.Metrology.Shared.Services; | ||||||
| using System.Net; | using System.Net; | ||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.ApiControllers; | namespace OI.Metrology.Server.ApiControllers; | ||||||
|  |  | ||||||
| @ -29,22 +30,9 @@ public partial class InboundController : ControllerBase, IInboundController<IAct | |||||||
|         _MetrologyRepository = metrologyRepository; |         _MetrologyRepository = metrologyRepository; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static string? GetJson(Stream stream) |  | ||||||
|     { |  | ||||||
|         string? result; |  | ||||||
|         if (!stream.CanRead) |  | ||||||
|             result = null; |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             Task<string> task = new StreamReader(stream).ReadToEndAsync(); |  | ||||||
|             result = task.Result; |  | ||||||
|         } |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     [HttpPost] |     [HttpPost] | ||||||
|     [Route("{tooltype}")] |     [Route("{tooltype}")] | ||||||
|     public IActionResult Post(string tooltype) |     public IActionResult Post(string tooltype, JsonElement? jsonElement) | ||||||
|     { |     { | ||||||
|         IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; |         IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; | ||||||
|         if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) |         if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) | ||||||
| @ -54,8 +42,7 @@ public partial class InboundController : ControllerBase, IInboundController<IAct | |||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             string? json = GetJson(Request.Body); |             DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, jsonElement); | ||||||
|             DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, json); |  | ||||||
|             if (dataResponse.Errors.Count == 0) |             if (dataResponse.Errors.Count == 0) | ||||||
|                 return Ok(dataResponse); |                 return Ok(dataResponse); | ||||||
|             else |             else | ||||||
| @ -65,7 +52,7 @@ public partial class InboundController : ControllerBase, IInboundController<IAct | |||||||
|  |  | ||||||
|     [HttpPost] |     [HttpPost] | ||||||
|     [Route("{tooltype}/attachment")] |     [Route("{tooltype}/attachment")] | ||||||
|     public IActionResult AttachFile(string tooltype, [FromQuery] long headerid, [FromQuery] string datauniqueid = "") |     public IActionResult AttachFile(string tooltype, Attachment? attachment) | ||||||
|     { |     { | ||||||
|         IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; |         IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; | ||||||
|         if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) |         if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) | ||||||
| @ -75,16 +62,8 @@ public partial class InboundController : ControllerBase, IInboundController<IAct | |||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             if (Request.Form is null) |             _InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, attachment); | ||||||
|                 return BadRequest($"Invalid form"); |             return Ok(); | ||||||
|             if (Request.Form.Files.Count != 1) |  | ||||||
|                 return BadRequest($"Invalid file count"); |  | ||||||
|             IFormFile formFile = Request.Form.Files[0]; |  | ||||||
|             string? message = _InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, headerid, datauniqueid, formFile.FileName, formFile); |  | ||||||
|             if (message is null) |  | ||||||
|                 return Ok(); |  | ||||||
|             else |  | ||||||
|                 return BadRequest(message); |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | |||||||
| @ -79,12 +79,8 @@ public class InfinityQSV4Controller : Controller, IInfinityQSV4Controller<IActio | |||||||
|     public IActionResult GetProductionSpecification(string part) => |     public IActionResult GetProductionSpecification(string part) => | ||||||
|        Content(_InfinityQSRepositoryV4.GetProductionSpecification(part)); |        Content(_InfinityQSRepositoryV4.GetProductionSpecification(part)); | ||||||
|  |  | ||||||
|     [HttpGet("engineering-spc-review")] |     [HttpGet("{process}/last-group-id-with-value")] | ||||||
|     public IActionResult GetEngineeringSpcReview() |     public IActionResult GetLastGroupIdWithValue(string process, string? part, int? test) => | ||||||
|     { |        Content(_InfinityQSRepositoryV4.GetLastGroupIdWithValue(process, part, test)); | ||||||
|         Dictionary<string, List<string>> results = _InfinityQSRepositoryV4.GetEngineeringSpcReview(); |  | ||||||
|         string json = JsonSerializer.Serialize(results); |  | ||||||
|         return Content(json, "application/json", System.Text.Encoding.UTF8); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -66,23 +66,6 @@ public class ToolTypesController : Controller, IToolTypesController<IActionResul | |||||||
|         return Content(json); |         return Content(json); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     [HttpGet] |  | ||||||
|     [Route("{toolTypeId}/export")] |  | ||||||
|     public IActionResult GetExportData(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend) |  | ||||||
|     { |  | ||||||
|         Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetExportData(_MetrologyRepo, toolTypeId, datebegin, dateend); |  | ||||||
|         string json = JsonConvert.SerializeObject(r); |  | ||||||
|         return Content(json); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     [HttpGet] |  | ||||||
|     [Route("{toolTypeId}/csv")] |  | ||||||
|     public IActionResult GetCSVExport(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] string? filename) |  | ||||||
|     { |  | ||||||
|         byte[] r = _ToolTypesRepository.GetCSVExport(_MetrologyRepo, toolTypeId, datebegin, dateend); |  | ||||||
|         return File(r, "application/octet-stream", filename); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     [HttpGet] |     [HttpGet] | ||||||
|     [Route("{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")] |     [Route("{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")] | ||||||
|     public IActionResult GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename) |     public IActionResult GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename) | ||||||
|  | |||||||
| @ -1,22 +0,0 @@ | |||||||
| using Microsoft.AspNetCore.Mvc; |  | ||||||
| using OI.Metrology.Shared.Models.Stateless; |  | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.ApiControllers; |  | ||||||
|  |  | ||||||
| [Route("api/v1/WaferCounter")] |  | ||||||
| public class WaferCounterController : Controller, IWaferCounterController<IActionResult> |  | ||||||
| { |  | ||||||
|  |  | ||||||
|     private readonly IWaferCounterRepository _WaferCounterRepository; |  | ||||||
|  |  | ||||||
|     public WaferCounterController(IWaferCounterRepository waferCounterRepository) => |  | ||||||
|         _WaferCounterRepository = waferCounterRepository; |  | ||||||
|  |  | ||||||
|     [HttpGet("{waferSize}/last-quantity-and-slot-map")] |  | ||||||
|     public IActionResult GetLastQuantityAndSlotMap(string area, string waferSize) => |  | ||||||
|         Json(_WaferCounterRepository.GetLastQuantityAndSlotMap(area, waferSize)); |  | ||||||
|  |  | ||||||
|     [HttpGet("{waferSize}/last-quantity-and-slot-map-with-text")] |  | ||||||
|     public IActionResult GetLastQuantityAndSlotMapWithText(string area, string waferSize, string text) => |  | ||||||
|         Json(_WaferCounterRepository.GetLastQuantityAndSlotMapWithText(area, waferSize, text)); |  | ||||||
| } |  | ||||||
| @ -1,160 +0,0 @@ | |||||||
| using Infineon.Monitoring.MonA; |  | ||||||
| using Microsoft.AspNetCore.Mvc; |  | ||||||
| using Microsoft.AspNetCore.Mvc.Filters; |  | ||||||
| using OI.Metrology.Server.Models; |  | ||||||
| using OI.Metrology.Shared.DataModels; |  | ||||||
| using OI.Metrology.Shared.Models.Stateless; |  | ||||||
| using OI.Metrology.Shared.ViewModels; |  | ||||||
| using System.Text; |  | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.Controllers; |  | ||||||
|  |  | ||||||
| public class ExportController : Controller |  | ||||||
| { |  | ||||||
|  |  | ||||||
|     private readonly ILogger _Logger; |  | ||||||
|     private readonly AppSettings _AppSettings; |  | ||||||
|     private readonly bool _IsTestDatabase; |  | ||||||
|     private readonly IMetrologyRepository _MetrologyRepository; |  | ||||||
|  |  | ||||||
|     public ExportController(AppSettings appSettings, ILogger<ExportController> logger, IMetrologyRepository metrologyRepository) |  | ||||||
|     { |  | ||||||
|         _Logger = logger; |  | ||||||
|         _AppSettings = appSettings; |  | ||||||
|         _MetrologyRepository = metrologyRepository; |  | ||||||
|         _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public override void OnActionExecuted(ActionExecutedContext context) |  | ||||||
|     { |  | ||||||
|         base.OnActionExecuted(context); |  | ||||||
|         ViewBag.IsTestDatabase = _IsTestDatabase; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private string GetApiUrl() => string.IsNullOrEmpty(_AppSettings.ApiUrl) ? Url.Content("~/") : _AppSettings.ApiUrl[0] == '~' ? Url.Content(_AppSettings.ApiUrl) : _AppSettings.ApiUrl; |  | ||||||
|  |  | ||||||
|     [HttpGet] |  | ||||||
|     [Route("/Export")] |  | ||||||
|     public ActionResult Index() |  | ||||||
|     { |  | ||||||
|         Export model = new() |  | ||||||
|         { |  | ||||||
|             StartTime = DateTime.Now.AddMonths(-1), |  | ||||||
|             EndTime = DateTime.Now |  | ||||||
|         }; |  | ||||||
|         MonIn monIn = MonIn.GetInstance(); |  | ||||||
|         _ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Up); |  | ||||||
|         ViewBag.ApiUrl = GetApiUrl(); |  | ||||||
|         return View(model); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     [HttpPost] |  | ||||||
|     [Route("/ExportData")] |  | ||||||
|     public ActionResult ExportData(Export model) |  | ||||||
|     { |  | ||||||
|         ToolType? toolType = null; |  | ||||||
|         if (string.IsNullOrEmpty(model.ToolType)) |  | ||||||
|             ModelState.AddModelError("Exception", "Invalid selection"); |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             if (model.StartTime > model.EndTime) |  | ||||||
|                 ModelState.AddModelError("EndTime", "End time must be after start time"); |  | ||||||
|             IEnumerable<ToolType> toolTypes = _MetrologyRepository.GetToolTypes(); |  | ||||||
|             toolType = toolTypes.Where(tt => tt.ID.ToString() == model.ToolType).SingleOrDefault(); |  | ||||||
|             if (toolType is null) |  | ||||||
|                 ModelState.AddModelError("ToolType", "Invalid selection"); |  | ||||||
|             else if (string.IsNullOrWhiteSpace(toolType.ExportSPName)) |  | ||||||
|                 ModelState.AddModelError("ToolType", "Tool type is not exportable"); |  | ||||||
|         } |  | ||||||
|         if (ModelState.IsValid) |  | ||||||
|         { |  | ||||||
|             try |  | ||||||
|             { |  | ||||||
|                 DateTime startDT = model.StartDate.Date.Add(model.StartTime.TimeOfDay); |  | ||||||
|                 DateTime endDT = model.EndDate.Date.Add(model.EndTime.TimeOfDay); |  | ||||||
|  |  | ||||||
|                 return DoCSVExport(toolType?.ToolTypeName, toolType?.ExportSPName, startDT, endDT); |  | ||||||
|             } |  | ||||||
|             catch (Exception ex) |  | ||||||
|             { |  | ||||||
|                 ModelState.AddModelError("Exception", "Error exporting data"); |  | ||||||
|                 ModelState.AddModelError("Exception", ex.Message); |  | ||||||
|                 string errorMessage = $"Error exporting: {ex}"; |  | ||||||
|                 _Logger.LogError(message: errorMessage); |  | ||||||
|                 MonIn monIn = MonIn.GetInstance(); |  | ||||||
|                 _ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Warning); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         ViewBag.ApiUrl = GetApiUrl(); |  | ||||||
|         return View("Index", model); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     protected ActionResult DoCSVExport(string? toolTypeName, string? spName, DateTime startTime, DateTime endTime) |  | ||||||
|     { |  | ||||||
|         string fileName = string.Format("Export_{0}_{1:yyyyMMddHHmm}_to_{2:yyyyMMddHHmm}.csv", toolTypeName, startTime, endTime); |  | ||||||
|         StringBuilder sb = new(); |  | ||||||
|         if (spName is null) |  | ||||||
|             throw new NullReferenceException(nameof(spName)); |  | ||||||
|         System.Data.DataTable dt = _MetrologyRepository.ExportData(spName, startTime, endTime); |  | ||||||
|         _ = sb.AppendLine(GetColumnHeaders(dt)); |  | ||||||
|         foreach (System.Data.DataRow dr in dt.Rows) |  | ||||||
|             _ = sb.AppendLine(GetRowData(dr)); |  | ||||||
|         byte[] contents = Encoding.UTF8.GetBytes(sb.ToString()); |  | ||||||
|         return File(contents, "application/octet-stream", fileName); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     protected static string GetRowData(System.Data.DataRow dr) |  | ||||||
|     { |  | ||||||
|         StringBuilder r = new(); |  | ||||||
|         for (int i = 0; i < dr.Table.Columns.Count; i++) |  | ||||||
|         { |  | ||||||
|             if (i > 0) |  | ||||||
|                 _ = r.Append(','); |  | ||||||
|             object v = dr[i]; |  | ||||||
|             if (!Convert.IsDBNull(v)) |  | ||||||
|             { |  | ||||||
|                 string? c = Convert.ToString(v); |  | ||||||
|                 if (c is not null) |  | ||||||
|                     _ = r.Append(FormatForCSV(c)); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return r.ToString(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     protected static string GetColumnHeaders(System.Data.DataTable dt) |  | ||||||
|     { |  | ||||||
|         StringBuilder r = new(); |  | ||||||
|         for (int i = 0; i < dt.Columns.Count; i++) |  | ||||||
|         { |  | ||||||
|             if (i > 0) |  | ||||||
|                 _ = r.Append(','); |  | ||||||
|  |  | ||||||
|             _ = r.Append(FormatForCSV(dt.Columns[i].ColumnName.TrimEnd('_'))); |  | ||||||
|         } |  | ||||||
|         return r.ToString(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     protected static string FormatForCSV(string v) |  | ||||||
|     { |  | ||||||
|         bool doubleQuoted = false; |  | ||||||
|         StringBuilder r = new(v.Length + 2); |  | ||||||
|         if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"')) |  | ||||||
|         { |  | ||||||
|             _ = r.Append('"'); |  | ||||||
|             doubleQuoted = true; |  | ||||||
|         } |  | ||||||
|         foreach (char c in v) |  | ||||||
|         { |  | ||||||
|             _ = c switch |  | ||||||
|             { |  | ||||||
|                 '\r' or '\n' => r.Append(' '), |  | ||||||
|                 '"' => r.Append("\"\""), |  | ||||||
|                 _ => r.Append(c), |  | ||||||
|             }; |  | ||||||
|         } |  | ||||||
|         if (doubleQuoted) |  | ||||||
|             _ = r.Append('"'); |  | ||||||
|         return r.ToString(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @ -1,79 +0,0 @@ | |||||||
| using Microsoft.AspNetCore.Mvc; |  | ||||||
| using Microsoft.AspNetCore.Mvc.Filters; |  | ||||||
| using OI.Metrology.Server.Models; |  | ||||||
| using OI.Metrology.Shared.Models.Stateless; |  | ||||||
| using OI.Metrology.Shared.ViewModels; |  | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.Controllers; |  | ||||||
|  |  | ||||||
| public class PagesController : Controller |  | ||||||
| { |  | ||||||
|  |  | ||||||
|     private readonly bool _IsTestDatabase; |  | ||||||
|     private readonly AppSettings _AppSettings; |  | ||||||
|     private readonly IMetrologyRepository _MetrologyRepository; |  | ||||||
|  |  | ||||||
|     public PagesController(AppSettings appSettings, IMetrologyRepository metrologyRepository) |  | ||||||
|     { |  | ||||||
|         _AppSettings = appSettings; |  | ||||||
|         _MetrologyRepository = metrologyRepository; |  | ||||||
|         _IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public override void OnActionExecuted(ActionExecutedContext context) |  | ||||||
|     { |  | ||||||
|         base.OnActionExecuted(context); |  | ||||||
|         ViewBag.IsTestDatabase = _IsTestDatabase; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private string GetApiUrl() => string.IsNullOrEmpty(_AppSettings.ApiUrl) ? Url.Content("~/") : _AppSettings.ApiUrl[0] == '~' ? Url.Content(_AppSettings.ApiUrl) : _AppSettings.ApiUrl; |  | ||||||
|  |  | ||||||
|     [HttpGet] |  | ||||||
|     [Route("/")] |  | ||||||
|     public IActionResult Index() |  | ||||||
|     { |  | ||||||
|         ViewBag.ApiUrl = GetApiUrl(); |  | ||||||
|         return View("AwaitingDispo"); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     [HttpGet] |  | ||||||
|     [Route("/AwaitingDispo")] |  | ||||||
|     [Route("/Metrology/AwaitingDispo")] |  | ||||||
|     public IActionResult AwaitingDispo() |  | ||||||
|     { |  | ||||||
|         ViewBag.ApiUrl = GetApiUrl(); |  | ||||||
|         return View(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     [HttpGet] |  | ||||||
|     [Route("/RunInfo")] |  | ||||||
|     [Route("/Metrology/RunInfo")] |  | ||||||
|     public IActionResult RunInfo([FromQuery] int tooltypeid = 1, [FromQuery] int headerid = 0) |  | ||||||
|     { |  | ||||||
|         RunInfo m = new() |  | ||||||
|         { |  | ||||||
|             ToolTypeID = tooltypeid, |  | ||||||
|             HeaderID = headerid, |  | ||||||
|             HeaderAttachmentID = Guid.Empty, |  | ||||||
|         }; |  | ||||||
|         if (headerid > 0) |  | ||||||
|         { |  | ||||||
|             m.HeaderAttachmentID = _MetrologyRepository.GetHeaderAttachmentID(tooltypeid, headerid); |  | ||||||
|         } |  | ||||||
|         ViewBag.ApiUrl = GetApiUrl(); |  | ||||||
|         return View(m); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     [HttpGet] |  | ||||||
|     [Route("/RunHeaders")] |  | ||||||
|     [Route("/Metrology/RunHeaders")] |  | ||||||
|     public IActionResult RunHeaders() |  | ||||||
|     { |  | ||||||
|         ViewBag.ApiUrl = GetApiUrl(); |  | ||||||
|         return View(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     [HttpGet] |  | ||||||
|     [Route("/Crash")] |  | ||||||
|     public IActionResult Crash() => throw new Exception("Test unhandled exception"); |  | ||||||
| } |  | ||||||
| @ -1,4 +1,5 @@ | |||||||
| using System.Text.Json; | using System.Text.Json; | ||||||
|  | using System.Text.Json.Serialization; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.Models; | namespace OI.Metrology.Server.Models; | ||||||
|  |  | ||||||
| @ -13,6 +14,7 @@ public record AppSettings(string ApiFileShare, | |||||||
|                           string EcCharacterizationSi, |                           string EcCharacterizationSi, | ||||||
|                           string EcMesaFileShareCharacterizationSi, |                           string EcMesaFileShareCharacterizationSi, | ||||||
|                           string EcMesaFileShareMetrologySi, |                           string EcMesaFileShareMetrologySi, | ||||||
|  |                           string EcMetrologySi, | ||||||
|                           string GitCommitSeven, |                           string GitCommitSeven, | ||||||
|                           string InboundApiAllowedIPList, |                           string InboundApiAllowedIPList, | ||||||
|                           string IqsColumns, |                           string IqsColumns, | ||||||
| @ -35,8 +37,75 @@ public record AppSettings(string ApiFileShare, | |||||||
|  |  | ||||||
|     public override string ToString() |     public override string ToString() | ||||||
|     { |     { | ||||||
|         string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); |         string result = JsonSerializer.Serialize(this, AppSettingsSourceGenerationContext.Default.AppSettings); | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private static void Verify(AppSettings appSettings) | ||||||
|  |     { | ||||||
|  |         if (string.IsNullOrEmpty(appSettings.Company)) | ||||||
|  |             throw new Exception("Company name must have a value!"); | ||||||
|  |         if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName)) | ||||||
|  |             throw new Exception("Working directory name must have a value!"); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public static AppSettings Get(IConfigurationRoot configurationRoot) | ||||||
|  |     { | ||||||
|  |         AppSettings result; | ||||||
|  |         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); | ||||||
|  | #pragma warning restore IL3050, IL2026 | ||||||
|  |         if (appSettings is null | ||||||
|  |             || appSettings?.Company is null) | ||||||
|  |         { | ||||||
|  |             List<string> paths = []; | ||||||
|  |             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) | ||||||
|  |             { | ||||||
|  |                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) | ||||||
|  |                     continue; | ||||||
|  |                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) | ||||||
|  |                     continue; | ||||||
|  |                 paths.Add(physicalFileProvider.Root); | ||||||
|  |             } | ||||||
|  |             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); | ||||||
|  |         } | ||||||
|  |         result = new(appSettings.ApiFileShare, | ||||||
|  |                      appSettings.ApiLoggingContentTypes, | ||||||
|  |                      appSettings.ApiLoggingPathPrefixes, | ||||||
|  |                      appSettings.ApiLogPath, | ||||||
|  |                      appSettings.ApiUrl, | ||||||
|  |                      appSettings.BuildNumber, | ||||||
|  |                      appSettings.Company, | ||||||
|  |                      appSettings.ConnectionString, | ||||||
|  |                      appSettings.EcCharacterizationSi, | ||||||
|  |                      appSettings.EcMesaFileShareCharacterizationSi, | ||||||
|  |                      appSettings.EcMesaFileShareMetrologySi, | ||||||
|  |                      appSettings.EcMetrologySi, | ||||||
|  |                      appSettings.GitCommitSeven, | ||||||
|  |                      appSettings.InboundApiAllowedIPList, | ||||||
|  |                      appSettings.IqsColumns, | ||||||
|  |                      appSettings.IqsFileSegments, | ||||||
|  |                      appSettings.IqsKey, | ||||||
|  |                      appSettings.IqsRed, | ||||||
|  |                      appSettings.IqsYellow, | ||||||
|  |                      appSettings.IsDevelopment, | ||||||
|  |                      appSettings.IsStaging, | ||||||
|  |                      appSettings.MockRoot, | ||||||
|  |                      appSettings.MonAResource, | ||||||
|  |                      appSettings.MonASite, | ||||||
|  |                      appSettings.OpenInsightApplicationProgrammingInterface, | ||||||
|  |                      appSettings.TableToPath, | ||||||
|  |                      appSettings.URLs, | ||||||
|  |                      appSettings.WaferCounterDestinationDirectory, | ||||||
|  |                      appSettings.WaferCounterTwoFileSecondsWait, | ||||||
|  |                      appSettings.WorkingDirectoryName); | ||||||
|  |         Verify(result); | ||||||
|  |         return result; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | [JsonSourceGenerationOptions(WriteIndented = true)] | ||||||
|  | [JsonSerializable(typeof(AppSettings))] | ||||||
|  | public partial class AppSettingsSourceGenerationContext : JsonSerializerContext | ||||||
|  | { | ||||||
| } | } | ||||||
| @ -1,2 +0,0 @@ | |||||||
| [*.cs] |  | ||||||
| csharp_preserve_single_line_statements = true |  | ||||||
| @ -1,145 +0,0 @@ | |||||||
| using System.Text.Json; |  | ||||||
| using System.Text.Json.Serialization; |  | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.Models.Binder; |  | ||||||
|  |  | ||||||
| public class AppSettings |  | ||||||
| { |  | ||||||
|  |  | ||||||
|     public string? ApiFileShare { get; set; } |  | ||||||
|     public string? ApiLoggingContentTypes { get; set; } |  | ||||||
|     public string? ApiLoggingPathPrefixes { get; set; } |  | ||||||
|     public string? ApiLogPath { get; set; } |  | ||||||
|     public string? ApiUrl { get; set; } |  | ||||||
|     public string? BuildNumber { get; set; } |  | ||||||
|     public string? Company { get; set; } |  | ||||||
|     public string? ConnectionString { get; set; } |  | ||||||
|     public string? EcCharacterizationSi { get; set; } |  | ||||||
|     public string? EcMesaFileShareCharacterizationSi { get; set; } |  | ||||||
|     public string? EcMesaFileShareMetrologySi { get; set; } |  | ||||||
|     public string? GitCommitSeven { get; set; } |  | ||||||
|     public string? InboundApiAllowedIPList { get; set; } |  | ||||||
|     public string? IqsColumns { get; set; } |  | ||||||
|     public string[]? IqsFileSegments { get; set; } |  | ||||||
|     public string? IqsKey { get; set; } |  | ||||||
|     public string? IqsRed { get; set; } |  | ||||||
|     public string? IqsYellow { get; set; } |  | ||||||
|     public bool? IsDevelopment { get; set; } |  | ||||||
|     public bool? IsStaging { get; set; } |  | ||||||
|     public string? MockRoot { get; set; } |  | ||||||
|     public string? MonAResource { get; set; } |  | ||||||
|     public string? MonASite { get; set; } |  | ||||||
|     public string? OpenInsightApplicationProgrammingInterface { get; set; } |  | ||||||
|     public Dictionary<string, string>? TableToPath { get; set; } |  | ||||||
|     public string? URLs { get; set; } |  | ||||||
|     public string? WaferCounterDestinationDirectory { get; set; } |  | ||||||
|     public int? WaferCounterTwoFileSecondsWait { get; set; } |  | ||||||
|     public string? WorkingDirectoryName { get; set; } |  | ||||||
|  |  | ||||||
|     public override string ToString() |  | ||||||
|     { |  | ||||||
|         string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings) |  | ||||||
|     { |  | ||||||
|         if (appSettings?.ApiFileShare is null) |  | ||||||
|         { |  | ||||||
|             List<string> paths = new(); |  | ||||||
|             foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) |  | ||||||
|             { |  | ||||||
|                 if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) |  | ||||||
|                     continue; |  | ||||||
|                 if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) |  | ||||||
|                     continue; |  | ||||||
|                 paths.Add(physicalFileProvider.Root); |  | ||||||
|             } |  | ||||||
|             throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private static Models.AppSettings Get(AppSettings? appSettings) |  | ||||||
|     { |  | ||||||
|         Models.AppSettings result; |  | ||||||
|         if (appSettings is null) throw new NullReferenceException(nameof(appSettings)); |  | ||||||
|         if (appSettings.ApiFileShare is null) throw new NullReferenceException(nameof(ApiFileShare)); |  | ||||||
|         if (appSettings.ApiLoggingContentTypes is null) throw new NullReferenceException(nameof(ApiLoggingContentTypes)); |  | ||||||
|         if (appSettings.ApiLoggingPathPrefixes is null) throw new NullReferenceException(nameof(ApiLoggingPathPrefixes)); |  | ||||||
|         if (appSettings.ApiLogPath is null) throw new NullReferenceException(nameof(ApiLogPath)); |  | ||||||
|         if (appSettings.ApiUrl is null) throw new NullReferenceException(nameof(ApiUrl)); |  | ||||||
|         if (appSettings.BuildNumber is null) throw new NullReferenceException(nameof(BuildNumber)); |  | ||||||
|         if (appSettings.Company is null) throw new NullReferenceException(nameof(Company)); |  | ||||||
|         if (appSettings.ConnectionString is null) throw new NullReferenceException(nameof(ConnectionString)); |  | ||||||
|         if (appSettings.EcCharacterizationSi is null) throw new NullReferenceException(nameof(EcCharacterizationSi)); |  | ||||||
|         if (appSettings.EcMesaFileShareCharacterizationSi is null) throw new NullReferenceException(nameof(EcMesaFileShareCharacterizationSi)); |  | ||||||
|         if (appSettings.EcMesaFileShareMetrologySi is null) throw new NullReferenceException(nameof(EcMesaFileShareMetrologySi)); |  | ||||||
|         if (appSettings.GitCommitSeven is null) throw new NullReferenceException(nameof(GitCommitSeven)); |  | ||||||
|         if (appSettings.InboundApiAllowedIPList is null) throw new NullReferenceException(nameof(InboundApiAllowedIPList)); |  | ||||||
|         if (appSettings.IqsColumns is null) throw new NullReferenceException(nameof(IqsColumns)); |  | ||||||
|         if (appSettings.IqsFileSegments is null) throw new NullReferenceException(nameof(IqsFileSegments)); |  | ||||||
|         if (appSettings.IqsKey is null) throw new NullReferenceException(nameof(IqsKey)); |  | ||||||
|         if (appSettings.IqsRed is null) throw new NullReferenceException(nameof(IqsRed)); |  | ||||||
|         if (appSettings.IqsYellow is null) throw new NullReferenceException(nameof(IqsYellow)); |  | ||||||
|         if (appSettings.IsDevelopment is null) throw new NullReferenceException(nameof(IsDevelopment)); |  | ||||||
|         if (appSettings.IsStaging is null) throw new NullReferenceException(nameof(IsStaging)); |  | ||||||
|         if (appSettings.MockRoot is null) throw new NullReferenceException(nameof(MockRoot)); |  | ||||||
|         if (appSettings.MonAResource is null) throw new NullReferenceException(nameof(MonAResource)); |  | ||||||
|         if (appSettings.MonASite is null) throw new NullReferenceException(nameof(MonASite)); |  | ||||||
|         if (appSettings.OpenInsightApplicationProgrammingInterface is null) throw new NullReferenceException(nameof(OpenInsightApplicationProgrammingInterface)); |  | ||||||
|         if (appSettings.URLs is null) throw new NullReferenceException(nameof(URLs)); |  | ||||||
|         if (appSettings.TableToPath is null) throw new NullReferenceException(nameof(TableToPath)); |  | ||||||
|         if (appSettings.WaferCounterDestinationDirectory is null) throw new NullReferenceException(nameof(WaferCounterDestinationDirectory)); |  | ||||||
|         if (appSettings.WaferCounterTwoFileSecondsWait is null) throw new NullReferenceException(nameof(WaferCounterTwoFileSecondsWait)); |  | ||||||
|         if (appSettings.WorkingDirectoryName is null) throw new NullReferenceException(nameof(WorkingDirectoryName)); |  | ||||||
|         result = new( |  | ||||||
|             appSettings.ApiFileShare, |  | ||||||
|             appSettings.ApiLoggingContentTypes, |  | ||||||
|             appSettings.ApiLoggingPathPrefixes, |  | ||||||
|             appSettings.ApiLogPath, |  | ||||||
|             appSettings.ApiUrl, |  | ||||||
|             appSettings.BuildNumber, |  | ||||||
|             appSettings.Company, |  | ||||||
|             appSettings.ConnectionString, |  | ||||||
|             appSettings.EcCharacterizationSi, |  | ||||||
|             appSettings.EcMesaFileShareCharacterizationSi, |  | ||||||
|             appSettings.EcMesaFileShareMetrologySi, |  | ||||||
|             appSettings.GitCommitSeven, |  | ||||||
|             appSettings.InboundApiAllowedIPList, |  | ||||||
|             appSettings.IqsColumns, |  | ||||||
|             appSettings.IqsFileSegments, |  | ||||||
|             appSettings.IqsKey, |  | ||||||
|             appSettings.IqsRed, |  | ||||||
|             appSettings.IqsYellow, |  | ||||||
|             appSettings.IsDevelopment.Value, |  | ||||||
|             appSettings.IsStaging.Value, |  | ||||||
|             appSettings.MockRoot, |  | ||||||
|             appSettings.MonAResource, |  | ||||||
|             appSettings.MonASite, |  | ||||||
|             appSettings.OpenInsightApplicationProgrammingInterface, |  | ||||||
|             appSettings.TableToPath, |  | ||||||
|             appSettings.URLs, |  | ||||||
|             appSettings.WaferCounterDestinationDirectory, |  | ||||||
|             appSettings.WaferCounterTwoFileSecondsWait.Value, |  | ||||||
|             appSettings.WorkingDirectoryName); |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public static Models.AppSettings Get(IConfigurationRoot configurationRoot) |  | ||||||
|     { |  | ||||||
|         Models.AppSettings result; |  | ||||||
| #pragma warning disable IL3050, IL2026 |  | ||||||
|         AppSettings? appSettings = configurationRoot.Get<AppSettings>(); |  | ||||||
| #pragma warning restore IL3050, IL2026 |  | ||||||
|         PreVerify(configurationRoot, appSettings); |  | ||||||
|         result = Get(appSettings); |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| [JsonSourceGenerationOptions(WriteIndented = true)] |  | ||||||
| [JsonSerializable(typeof(AppSettings))] |  | ||||||
| internal partial class BinderAppSettingsSourceGenerationContext : JsonSerializerContext |  | ||||||
| { |  | ||||||
| } |  | ||||||
| @ -6,6 +6,7 @@ | |||||||
|         <SccLocalPath>SAK</SccLocalPath> |         <SccLocalPath>SAK</SccLocalPath> | ||||||
|     </PropertyGroup> |     </PropertyGroup> | ||||||
|     <PropertyGroup> |     <PropertyGroup> | ||||||
|  |         <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild> | ||||||
|         <ImplicitUsings>enable</ImplicitUsings> |         <ImplicitUsings>enable</ImplicitUsings> | ||||||
|         <IsPackable>false</IsPackable> |         <IsPackable>false</IsPackable> | ||||||
|         <Nullable>enable</Nullable> |         <Nullable>enable</Nullable> | ||||||
| @ -24,22 +25,22 @@ | |||||||
|         <Content Remove="compilerconfig.json" /> |         <Content Remove="compilerconfig.json" /> | ||||||
|     </ItemGroup> |     </ItemGroup> | ||||||
|     <ItemGroup> |     <ItemGroup> | ||||||
|         <PackageReference Include="Dapper" Version="2.1.24" /> |         <PackageReference Include="Dapper" Version="2.1.44" /> | ||||||
|         <PackageReference Include="EntityFramework" Version="6.4.4" /> |         <PackageReference Include="EntityFramework" Version="6.5.1" /> | ||||||
|         <PackageReference Include="jQuery" Version="3.7.1" /> |         <PackageReference Include="jQuery" Version="3.7.1" /> | ||||||
|         <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.0" /> |         <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.10" /> | ||||||
|         <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" /> |         <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" /> | ||||||
|         <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" /> |         <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" /> | ||||||
|         <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" /> |         <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.1" /> | ||||||
|         <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" /> |         <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" /> | ||||||
|         <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" /> |         <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" /> | ||||||
|         <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /> |         <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" /> | ||||||
|         <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" /> |         <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" /> | ||||||
|         <PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.0" /> |         <PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.1" /> | ||||||
|         <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> |         <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> | ||||||
|         <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> |         <PackageReference Include="Swashbuckle.AspNetCore" Version="6.8.1" /> | ||||||
|         <PackageReference Include="System.Data.SqlClient" Version="4.8.5" /> |         <PackageReference Include="System.Data.SqlClient" Version="4.8.6" /> | ||||||
|         <PackageReference Include="System.Drawing.Common" Version="8.0.0" /> |         <PackageReference Include="System.Drawing.Common" Version="8.0.10" /> | ||||||
|     </ItemGroup> |     </ItemGroup> | ||||||
|     <ItemGroup> |     <ItemGroup> | ||||||
|         <ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" /> |         <ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" /> | ||||||
|  | |||||||
| @ -43,7 +43,7 @@ public class Program | |||||||
|         (string assemblyName, WebApplicationOptions _) = Get(args); |         (string assemblyName, WebApplicationOptions _) = Get(args); | ||||||
|         WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args); |         WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args); | ||||||
|         _ = webApplicationBuilder.Configuration.AddUserSecrets<Program>(); |         _ = webApplicationBuilder.Configuration.AddUserSecrets<Program>(); | ||||||
|         AppSettings appSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration); |         AppSettings appSettings = AppSettings.Get(webApplicationBuilder.Configuration); | ||||||
|         if (string.IsNullOrEmpty(appSettings.Company)) |         if (string.IsNullOrEmpty(appSettings.Company)) | ||||||
|             throw new Exception("Company name must have a value!"); |             throw new Exception("Company name must have a value!"); | ||||||
|         if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName)) |         if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName)) | ||||||
| @ -74,12 +74,11 @@ public class Program | |||||||
|             _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV2Repository, InfinityQSV2Repository>(); |             _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV2Repository, InfinityQSV2Repository>(); | ||||||
|             _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV3Repository, InfinityQSV3Repository>(); |             _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV3Repository, InfinityQSV3Repository>(); | ||||||
|             _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV4Repository, InfinityQSV4Repository>(); |             _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV4Repository, InfinityQSV4Repository>(); | ||||||
|             _ = webApplicationBuilder.Services.AddSingleton<IWaferCounterRepository, WaferCounterRepository>(); |  | ||||||
|             _ = webApplicationBuilder.Services.AddSingleton<IClientSettingsRepository>(_ => clientSettingsRepository); |             _ = webApplicationBuilder.Services.AddSingleton<IClientSettingsRepository>(_ => clientSettingsRepository); | ||||||
|             _ = webApplicationBuilder.Services.AddSingleton<IServiceShopOrderRepository, ServiceShopOrderRepository>(); |             _ = webApplicationBuilder.Services.AddSingleton<IServiceShopOrderRepository, ServiceShopOrderRepository>(); | ||||||
|             _ = webApplicationBuilder.Services.AddSingleton<ISpreadingResistanceProfileService, SpreadingResistanceProfileService>(); |             _ = webApplicationBuilder.Services.AddSingleton<ISpreadingResistanceProfileService, SpreadingResistanceProfileService>(); | ||||||
|             _ = webApplicationBuilder.Services.AddSingleton<IDbConnectionFactory, SQLDbConnectionFactory>(_ => sqlDbConnectionFactory); |             _ = webApplicationBuilder.Services.AddSingleton<IDbConnectionFactory, SQLDbConnectionFactory>(_ => sqlDbConnectionFactory); | ||||||
|             _ = webApplicationBuilder.Services.AddSingleton<IAppSettingsRepository<Models.Binder.AppSettings>>(_ => appSettingsRepository); |             _ = webApplicationBuilder.Services.AddSingleton<IAppSettingsRepository<AppSettings>>(_ => appSettingsRepository); | ||||||
|  |  | ||||||
|             _ = webApplicationBuilder.Services.AddSwaggerGen(); |             _ = webApplicationBuilder.Services.AddSwaggerGen(); | ||||||
|             _ = webApplicationBuilder.Services.AddSession(sessionOptions => |             _ = webApplicationBuilder.Services.AddSession(sessionOptions => | ||||||
|  | |||||||
| @ -3,27 +3,20 @@ using OI.Metrology.Shared.Models.Stateless; | |||||||
|  |  | ||||||
| namespace OI.Metrology.Server.Repository; | namespace OI.Metrology.Server.Repository; | ||||||
|  |  | ||||||
| public class AppSettingsRepository : IAppSettingsRepository<Models.Binder.AppSettings> | public class AppSettingsRepository : IAppSettingsRepository<AppSettings> | ||||||
| { | { | ||||||
|  |  | ||||||
|     private readonly AppSettings _AppSettings; |     private readonly AppSettings _AppSettings; | ||||||
|  |  | ||||||
|     public AppSettingsRepository(AppSettings appSettings) => _AppSettings = appSettings; |     public AppSettingsRepository(AppSettings appSettings) => _AppSettings = appSettings; | ||||||
|  |  | ||||||
|     internal Models.Binder.AppSettings GetAppSettings() |     internal AppSettings GetAppSettings() | ||||||
|     { |     { | ||||||
|         Models.Binder.AppSettings result = new() |         AppSettings result = _AppSettings; | ||||||
|         { |  | ||||||
|             BuildNumber = _AppSettings.BuildNumber, |  | ||||||
|             Company = _AppSettings.Company, |  | ||||||
|             GitCommitSeven = _AppSettings.GitCommitSeven, |  | ||||||
|             IsDevelopment = _AppSettings.IsDevelopment, |  | ||||||
|             IsStaging = _AppSettings.IsStaging, |  | ||||||
|         }; |  | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Models.Binder.AppSettings IAppSettingsRepository<Models.Binder.AppSettings>.GetAppSettings() => GetAppSettings(); |     AppSettings IAppSettingsRepository<AppSettings>.GetAppSettings() => GetAppSettings(); | ||||||
|  |  | ||||||
|     internal string GetBuildNumberAndGitCommitSeven() |     internal string GetBuildNumberAndGitCommitSeven() | ||||||
|     { |     { | ||||||
| @ -45,8 +38,8 @@ public class AppSettingsRepository : IAppSettingsRepository<Models.Binder.AppSet | |||||||
| #endif | #endif | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     string IAppSettingsRepository<Models.Binder.AppSettings>.GetBuildNumberAndGitCommitSeven() => GetBuildNumberAndGitCommitSeven(); |     string IAppSettingsRepository<AppSettings>.GetBuildNumberAndGitCommitSeven() => GetBuildNumberAndGitCommitSeven(); | ||||||
|  |  | ||||||
|     void IAppSettingsRepository<Models.Binder.AppSettings>.VerifyConnectionStrings() => VerifyConnectionStrings(); |     void IAppSettingsRepository<AppSettings>.VerifyConnectionStrings() => VerifyConnectionStrings(); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -2,7 +2,10 @@ using OI.Metrology.Server.Models; | |||||||
| using OI.Metrology.Shared.DataModels; | using OI.Metrology.Shared.DataModels; | ||||||
| using OI.Metrology.Shared.Models; | using OI.Metrology.Shared.Models; | ||||||
| using OI.Metrology.Shared.Models.Stateless; | using OI.Metrology.Shared.Models.Stateless; | ||||||
|  | using System.Collections.ObjectModel; | ||||||
|  | using System.Data; | ||||||
| using System.Globalization; | using System.Globalization; | ||||||
|  | using System.Text; | ||||||
| using System.Text.Json; | using System.Text.Json; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.Repository; | namespace OI.Metrology.Server.Repository; | ||||||
| @ -42,15 +45,15 @@ public class ExportRepository : IExportRepository | |||||||
|         List<NginxFileSystemSortable> results = new(); |         List<NginxFileSystemSortable> results = new(); | ||||||
|         Uri uri; |         Uri uri; | ||||||
|         string[] weeks = Get(); |         string[] weeks = Get(); | ||||||
|         List<NginxFileSystemSortable> nginxFileSystemSortableCollection; |         ReadOnlyCollection<NginxFileSystemSortable> collection; | ||||||
|         foreach (string weekYear in weeks) |         foreach (string weekYear in weeks) | ||||||
|         { |         { | ||||||
|             if (headerCommon.ID < 1) |             if (headerCommon.ID < 1) | ||||||
|                 uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareMetrologySi), "Archive", "API", weekYear, $"-{headerCommon.PSN}", $"-{headerCommon.Reactor}", $"-{headerCommon.RDS}"); |                 uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareMetrologySi), "Archive", "API", weekYear, $"-{headerCommon.PSN}", $"-{headerCommon.Reactor}", $"-{headerCommon.RDS}"); | ||||||
|             else |             else | ||||||
|                 uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareMetrologySi), "Archive", "API", weekYear, $"-{headerCommon.PSN}", $"-{headerCommon.Reactor}", $"-{headerCommon.RDS}", $"-{headerCommon.ID}"); |                 uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareMetrologySi), "Archive", "API", weekYear, $"-{headerCommon.PSN}", $"-{headerCommon.Reactor}", $"-{headerCommon.RDS}", $"-{headerCommon.ID}"); | ||||||
|             nginxFileSystemSortableCollection = _FileShareRepository.GetNginxFileSystemSortableCollection(httpClient, uri, endsWith); |             collection = _FileShareRepository.GetNginxFileSystemSortableCollection(httpClient, uri, endsWith); | ||||||
|             results.AddRange(nginxFileSystemSortableCollection); |             results.AddRange(collection); | ||||||
|         } |         } | ||||||
|         return results.OrderByDescending(l => l.DateTime).ToArray(); |         return results.OrderByDescending(l => l.DateTime).ToArray(); | ||||||
|     } |     } | ||||||
| @ -160,4 +163,86 @@ public class ExportRepository : IExportRepository | |||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     Result<DataTable> IExportRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend) | ||||||
|  |     { | ||||||
|  |         Result<DataTable>? r; | ||||||
|  |         DateTime dateEnd = dateend is null ? DateTime.Now : DateTime.Parse(dateend); | ||||||
|  |         DateTime dateBegin = datebegin is null ? dateEnd.AddMonths(-1) : DateTime.Parse(datebegin); | ||||||
|  |         ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId); | ||||||
|  |         if (string.IsNullOrEmpty(tt.ExportSPName)) | ||||||
|  |             throw new NullReferenceException(nameof(tt.ExportSPName)); | ||||||
|  |         DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, dateBegin, dateEnd); | ||||||
|  |         r = new() | ||||||
|  |         { | ||||||
|  |             Results = dataTable, | ||||||
|  |             TotalRows = dataTable.Rows.Count, | ||||||
|  |         }; | ||||||
|  |         return r; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected static string FormatForCSV(string v) | ||||||
|  |     { | ||||||
|  |         StringBuilder result = new(v.Length + 2); | ||||||
|  |         bool doubleQuoted = false; | ||||||
|  |         if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"')) | ||||||
|  |         { | ||||||
|  |             _ = result.Append('"'); | ||||||
|  |             doubleQuoted = true; | ||||||
|  |         } | ||||||
|  |         foreach (char c in v) | ||||||
|  |         { | ||||||
|  |             _ = c switch | ||||||
|  |             { | ||||||
|  |                 '\r' or '\n' => result.Append(' '), | ||||||
|  |                 '"' => result.Append("\"\""), | ||||||
|  |                 _ => result.Append(c), | ||||||
|  |             }; | ||||||
|  |         } | ||||||
|  |         if (doubleQuoted) | ||||||
|  |             _ = result.Append('"'); | ||||||
|  |         return result.ToString(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected static string GetColumnHeaders(DataTable dataTable) | ||||||
|  |     { | ||||||
|  |         StringBuilder result = new(); | ||||||
|  |         for (int i = 0; i < dataTable.Columns.Count; i++) | ||||||
|  |         { | ||||||
|  |             if (i > 0) | ||||||
|  |                 _ = result.Append(','); | ||||||
|  |             _ = result.Append(FormatForCSV(dataTable.Columns[i].ColumnName.TrimEnd('_'))); | ||||||
|  |         } | ||||||
|  |         return result.ToString(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     protected static string GetRowData(DataRow dr) | ||||||
|  |     { | ||||||
|  |         StringBuilder result = new(); | ||||||
|  |         for (int i = 0; i < dr.Table.Columns.Count; i++) | ||||||
|  |         { | ||||||
|  |             if (i > 0) | ||||||
|  |                 _ = result.Append(','); | ||||||
|  |             object v = dr[i]; | ||||||
|  |             if (v is not null && !Convert.IsDBNull(v)) | ||||||
|  |                 _ = result.Append(FormatForCSV(string.Concat(Convert.ToString(v)))); | ||||||
|  |         } | ||||||
|  |         return result.ToString(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     string IExportRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend) | ||||||
|  |     { | ||||||
|  |         string results; | ||||||
|  |         Result<DataTable> result; | ||||||
|  |         IExportRepository repository = this; | ||||||
|  |         result = repository.GetExportData(metrologyRepository, toolTypeId, datebegin, dateend); | ||||||
|  |         if (result.Results is null) | ||||||
|  |             throw new NullReferenceException(nameof(result.Results)); | ||||||
|  |         StringBuilder stringBuilder = new(); | ||||||
|  |         _ = stringBuilder.AppendLine(GetColumnHeaders(result.Results)); | ||||||
|  |         foreach (DataRow dr in result.Results.Rows) | ||||||
|  |             _ = stringBuilder.AppendLine(GetRowData(dr)); | ||||||
|  |         results = stringBuilder.ToString(); | ||||||
|  |         return results; | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -1,6 +1,9 @@ | |||||||
|  | using OI.Metrology.Shared.DataModels; | ||||||
| using OI.Metrology.Shared.Models; | using OI.Metrology.Shared.Models; | ||||||
| using OI.Metrology.Shared.Models.Stateless; | using OI.Metrology.Shared.Models.Stateless; | ||||||
|  | using System.Collections.ObjectModel; | ||||||
| using System.Text.Json; | using System.Text.Json; | ||||||
|  | using System.Web; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.Repository; | namespace OI.Metrology.Server.Repository; | ||||||
|  |  | ||||||
| @ -33,6 +36,8 @@ public class FileShareRepository : IFileShareRepository | |||||||
|         string directory = Path.GetDirectoryName(to) ?? throw new NullReferenceException(); |         string directory = Path.GetDirectoryName(to) ?? throw new NullReferenceException(); | ||||||
|         if (!Directory.Exists(directory)) |         if (!Directory.Exists(directory)) | ||||||
|             _ = Directory.CreateDirectory(directory); |             _ = Directory.CreateDirectory(directory); | ||||||
|  |         if (File.Exists(to)) | ||||||
|  |             File.Move(to, $"{to}.{DateTime.Now.Ticks}.old"); | ||||||
|         File.Move(from, to); |         File.Move(from, to); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @ -47,7 +52,9 @@ public class FileShareRepository : IFileShareRepository | |||||||
|     void IFileShareRepository.CopyFile(HttpClient httpClient, string from, string to) |     void IFileShareRepository.CopyFile(HttpClient httpClient, string from, string to) | ||||||
|     { |     { | ||||||
|         Uri uri = GetEndPoint(httpClient, "copy-file"); |         Uri uri = GetEndPoint(httpClient, "copy-file"); | ||||||
|         Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri); |         string encodedTo = HttpUtility.UrlEncode(to); | ||||||
|  |         string encodedFrom = HttpUtility.UrlEncode(from); | ||||||
|  |         Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync($"{uri.OriginalString}?from={encodedFrom}&to={encodedTo}"); | ||||||
|         httpResponseMessage.Wait(); |         httpResponseMessage.Wait(); | ||||||
|         if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) |         if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||||
|             throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); |             throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); | ||||||
| @ -56,16 +63,9 @@ public class FileShareRepository : IFileShareRepository | |||||||
|     void IFileShareRepository.MoveFile(HttpClient httpClient, string from, string to) |     void IFileShareRepository.MoveFile(HttpClient httpClient, string from, string to) | ||||||
|     { |     { | ||||||
|         Uri uri = GetEndPoint(httpClient, "move-file"); |         Uri uri = GetEndPoint(httpClient, "move-file"); | ||||||
|         Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri); |         string encodedTo = HttpUtility.UrlEncode(to); | ||||||
|         httpResponseMessage.Wait(); |         string encodedFrom = HttpUtility.UrlEncode(from); | ||||||
|         if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) |         Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync($"{uri.OriginalString}?from={encodedFrom}&to={encodedTo}"); | ||||||
|             throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void IFileShareRepository.FileWrite(HttpClient httpClient, string path, string contents) |  | ||||||
|     { |  | ||||||
|         Uri uri = GetEndPoint(httpClient, "file-write"); |  | ||||||
|         Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri); |  | ||||||
|         httpResponseMessage.Wait(); |         httpResponseMessage.Wait(); | ||||||
|         if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) |         if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||||
|             throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); |             throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); | ||||||
| @ -80,7 +80,7 @@ public class FileShareRepository : IFileShareRepository | |||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     List<NginxFileSystemSortable> IFileShareRepository.GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith) |     ReadOnlyCollection<NginxFileSystemSortable> IFileShareRepository.GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith) | ||||||
|     { |     { | ||||||
|         List<NginxFileSystemSortable> results = new(); |         List<NginxFileSystemSortable> results = new(); | ||||||
|         Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri); |         Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri); | ||||||
| @ -99,7 +99,13 @@ public class FileShareRepository : IFileShareRepository | |||||||
|                 results.Add(nginxFileSystemSortable); |                 results.Add(nginxFileSystemSortable); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         return results; |         return new(results); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     ReadOnlyCollection<CharacterizationInfo> IFileShareRepository.GetArchiveData(CharacterizationParameters archiveParameters) => | ||||||
|  |         throw new NotImplementedException(); | ||||||
|  |  | ||||||
|  |     ReadOnlyCollection<ToolTypeNameId> IFileShareRepository.GetEquipmentIds() => | ||||||
|  |         throw new NotImplementedException(); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -31,76 +31,42 @@ public class InboundRepository : IInboundRepository | |||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // this is the main endpoint, it accepts a JSON message that contains both the header and data records together |     DataResponse IInboundRepository.Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string toolTypeName, JsonElement? jsonElement) | ||||||
|     // tooltype is the ToolTypeName column from the ToolType table |  | ||||||
|     // JToken is how you can accept a JSON message without deserialization. |  | ||||||
|     // Using "string" doesn't work because ASP.NET Core will expect a json encoded string, not give you the actual string. |  | ||||||
|     DataResponse IInboundRepository.Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string tooltype, string? json) |  | ||||||
|     { |     { | ||||||
|         DataResponse result = new(); |         DataResponse result = new(); | ||||||
|         ToolType? toolType = metrologyRepository.GetToolTypeByName(tooltype); |         if (jsonElement is null || jsonElement.Value.ValueKind != JsonValueKind.Object) | ||||||
|         if (toolType is null) |             throw new Exception("Invalid body!"); | ||||||
|             result.Errors.Add($"Invalid tool type: {tooltype}"); |         string? json = jsonElement.ToString(); | ||||||
|         else |         JToken jToken = (string.IsNullOrEmpty(json) ? JToken.Parse("{}") : JToken.Parse(json)) ?? | ||||||
|  |             throw new Exception($"Invalid body: {json}"); | ||||||
|  |         ToolType toolType = metrologyRepository.GetToolTypeByName(toolTypeName) ?? | ||||||
|  |             throw new Exception($"Invalid tool type: {toolTypeName}"); | ||||||
|  |         List<ToolTypeMetadata> metaData = metrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList(); | ||||||
|  |         inboundDataService.ValidateJSONFields(jToken, 0, metaData, result.Errors, result.Warnings); | ||||||
|  |         if (result.Errors.Count == 0) | ||||||
|         { |         { | ||||||
|             InboundCommon? inboundCommon = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize<InboundCommon>(json); |             try | ||||||
|             if (inboundCommon is null || string.IsNullOrEmpty(inboundCommon.ProcessDataStandardFormat)) |  | ||||||
|                 result.Errors.Add($"Invalid body: {json}"); |  | ||||||
|             else |  | ||||||
|             { |             { | ||||||
|                 string? sourceDirectory = Path.GetDirectoryName(inboundCommon.ProcessDataStandardFormat); |                 result.HeaderID = inboundDataService.DoSQLInsert(jToken, toolType, metaData); | ||||||
|                 string? parentDirectory = Path.GetDirectoryName(sourceDirectory); |                 result.Success = result.HeaderID > 0; | ||||||
|                 if (string.IsNullOrEmpty(sourceDirectory) || string.IsNullOrEmpty(parentDirectory) || !Directory.Exists(parentDirectory)) |  | ||||||
|                     result.Errors.Add($"Invalid body:path: <{inboundCommon.ProcessDataStandardFormat}>"); |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     JToken jToken = string.IsNullOrEmpty(json) ? JToken.Parse("{}") : JToken.Parse(json); |  | ||||||
|                     if (jToken is null) |  | ||||||
|                         result.Errors.Add($"Invalid body: {json}"); |  | ||||||
|                     else |  | ||||||
|                     { |  | ||||||
|                         List<ToolTypeMetadata> metaData = metrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList(); |  | ||||||
|                         if (metaData is null) |  | ||||||
|                             result.Errors.Add($"Invalid metadata for tool type: {tooltype}"); |  | ||||||
|                         else |  | ||||||
|                         { |  | ||||||
|                             inboundDataService.ValidateJSONFields(jToken, 0, metaData, result.Errors, result.Warnings); |  | ||||||
|                             if (result.Errors.Count == 0) |  | ||||||
|                             { |  | ||||||
|                                 try |  | ||||||
|                                 { |  | ||||||
|                                     result.HeaderID = inboundDataService.DoSQLInsert(jToken, toolType, metaData); |  | ||||||
|                                     result.Success = result.HeaderID > 0; |  | ||||||
|                                     string? destinationDirectory = Path.Combine(parentDirectory, result.HeaderID.ToString()); |  | ||||||
|                                     Directory.Move(sourceDirectory, destinationDirectory); |  | ||||||
|                                 } |  | ||||||
|                                 catch (Exception ex) { result.Errors.Add(ex.Message); } |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|  |             catch (Exception ex) { result.Errors.Add(ex.Message); } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // this is the endpoint for attaching a field.  It is not JSON, it is form-data/multipart like an HTML form because that's the normal way. |     void IInboundRepository.AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string toolTypeName, Attachment? attachment) | ||||||
|     // header ID is the ID value from the Header table |  | ||||||
|     // datauniqueid is the Title value from the Data/Detail table |  | ||||||
|     string? IInboundRepository.AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string tooltype, long headerid, string datauniqueid, string fileName, object uploadedFile) |  | ||||||
|     { |     { | ||||||
|         string? result = null; |         if (attachment is null) | ||||||
|         ToolType toolType = metrologyRepository.GetToolTypeByName(tooltype); |             throw new Exception("Invalid body!"); | ||||||
|         if (toolType is null) |         ToolType toolType = metrologyRepository.GetToolTypeByName(toolTypeName) ?? | ||||||
|             result = $"Invalid tool type: {tooltype}"; |             throw new Exception($"Invalid tool type: {toolTypeName}"); | ||||||
|         string filename = Path.GetFileName(fileName); |         if (string.IsNullOrWhiteSpace(attachment.DestinationFileName)) | ||||||
|         if (string.IsNullOrWhiteSpace(filename)) |             throw new Exception("Empty filename"); | ||||||
|             result = "Empty filename"; |         if (attachment.DestinationFileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) | ||||||
|         if (filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) |             throw new Exception("Invalid filename"); | ||||||
|             result = "Invalid filename"; |         attachmentsService.SaveAttachment(toolType, attachment); | ||||||
|         if (result is null && toolType is not null) |  | ||||||
|             attachmentsService.SaveAttachment(toolType, headerid, datauniqueid, filename, uploadedFile); |  | ||||||
|         return result; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -6,7 +6,6 @@ using OI.Metrology.Shared.Repositories; | |||||||
| using System.Collections.ObjectModel; | using System.Collections.ObjectModel; | ||||||
| using System.Data; | using System.Data; | ||||||
| using System.Data.Common; | using System.Data.Common; | ||||||
| using System.Reflection; |  | ||||||
| using System.Text; | using System.Text; | ||||||
| using System.Text.Json; | using System.Text.Json; | ||||||
|  |  | ||||||
| @ -38,124 +37,139 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository | |||||||
|  |  | ||||||
|     string IInfinityQSV4Repository.GetCommandText(string subGroupId) |     string IInfinityQSV4Repository.GetCommandText(string subGroupId) | ||||||
|     { // cSpell:disable |     { // cSpell:disable | ||||||
|         StringBuilder result = new(); |         List<string> results = []; | ||||||
|         if (string.IsNullOrEmpty(subGroupId)) |         if (string.IsNullOrEmpty(subGroupId)) | ||||||
|             throw new ArgumentException(null, nameof(subGroupId)); |             throw new ArgumentException(null, nameof(subGroupId)); | ||||||
|         _ = result |         results.Add(" select "); | ||||||
|             .AppendLine(" select ") |         results.Add("       sd.f_sgrp sd_sgrp, "); | ||||||
|             .AppendLine("       sd.f_sgrp sd_sgrp, ") |         results.Add("       sd.f_tsno sd_tsno, "); | ||||||
|             .AppendLine("       sd.f_tsno sd_tsno, ") |         results.Add("       dd.f_dsgp dd_dsgp, "); | ||||||
|             .AppendLine("       dd.f_dsgp dd_dsgp, ") |         results.Add("       dg.f_name gd_name, "); | ||||||
|             .AppendLine("       dg.f_name gd_name, ") |         results.Add("       dd.f_name dd_name "); | ||||||
|             .AppendLine("       dd.f_name dd_name ") |         results.Add(" from [SPCEPIWORLD].[dbo].[SGRP_DSC] sd "); | ||||||
|             .AppendLine(" from [SPCEPIWORLD].[dbo].[SGRP_DSC] sd ") |         results.Add(" join [SPCEPIWORLD].[dbo].[DESC_DAT] dd "); | ||||||
|             .AppendLine(" join [SPCEPIWORLD].[dbo].[DESC_DAT] dd ") |         results.Add("   on sd.f_dsgp = dd.f_dsgp "); | ||||||
|             .AppendLine("   on sd.f_dsgp = dd.f_dsgp ") |         results.Add("  and sd.f_desc = dd.f_desc "); | ||||||
|             .AppendLine("  and sd.f_desc = dd.f_desc ") |         results.Add(" join [SPCEPIWORLD].[dbo].[DESC_GRP] dg "); | ||||||
|             .AppendLine(" join [SPCEPIWORLD].[dbo].[DESC_GRP] dg ") |         results.Add("   on dd.f_dsgp = dg.f_dsgp "); | ||||||
|             .AppendLine("   on dd.f_dsgp = dg.f_dsgp "); |         results.Add($" where sd.f_sgrp = {subGroupId} "); | ||||||
|         _ = result.Append(" where sd.f_sgrp = ").Append(subGroupId).AppendLine(" "); |         results.Add(" for json path "); | ||||||
|         _ = result.AppendLine(" for json path "); |         return string.Join(' ', results); | ||||||
|         return result.ToString(); |  | ||||||
|     } // cSpell:enable |     } // cSpell:enable | ||||||
|  |  | ||||||
|     string IInfinityQSV4Repository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime) |     string IInfinityQSV4Repository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime) | ||||||
|     { // cSpell:disable |     { // cSpell:disable | ||||||
|         StringBuilder result = new(); |         List<string> results = []; | ||||||
|         const string dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; |         const string dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; | ||||||
|         if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')) && dateTime.Length != dateTimeFormat.Length) |         if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')) && dateTime.Length != dateTimeFormat.Length) | ||||||
|             throw new ArgumentException(null, nameof(dateTime)); |             throw new ArgumentException(null, nameof(dateTime)); | ||||||
|         _ = result |         results.Add(" select case when iq.sl_loos is null then 0 else iq.sl_loos end + "); | ||||||
|             .AppendLine(" select case when iq.sl_loos is null then 0 else iq.sl_loos end + ") |         results.Add("        case when iq.sl_uoos is null then 0 else iq.sl_uoos end + "); | ||||||
|             .AppendLine("        case when iq.sl_uoos is null then 0 else iq.sl_uoos end + ") |         results.Add("        iq.ev_count as iq_sum, "); | ||||||
|             .AppendLine("        iq.ev_count as iq_sum, ") |         results.Add("        iq.sl_aflag, "); | ||||||
|             .AppendLine("        iq.sl_aflag, ") |         results.Add("        iq.sl_loos, "); | ||||||
|             .AppendLine("        iq.sl_loos, ") |         results.Add("        iq.sl_uoos, "); | ||||||
|             .AppendLine("        iq.sl_uoos, ") |         results.Add("        iq.se_sgrp, "); | ||||||
|             .AppendLine("        iq.se_sgrp, ") |         results.Add("        iq.se_sgtm, "); | ||||||
|             .AppendLine("        iq.se_sgtm, ") |         results.Add("        iq.se_tsno, "); | ||||||
|             .AppendLine("        iq.se_tsno, ") |         results.Add("        iq.td_test, "); | ||||||
|             .AppendLine("        iq.td_test, ") |         results.Add("        iq.pr_name, "); | ||||||
|             .AppendLine("        iq.pr_name, ") |         results.Add("        iq.jd_name, "); | ||||||
|             .AppendLine("        iq.jd_name, ") |         results.Add("        iq.pl_name, "); | ||||||
|             .AppendLine("        iq.pl_name, ") |         results.Add("        iq.pd_name, "); | ||||||
|             .AppendLine("        iq.pd_name, ") |         results.Add("        iq.td_name, "); | ||||||
|             .AppendLine("        iq.td_name, ") |         results.Add("        iq.se_val, "); | ||||||
|             .AppendLine("        iq.se_val, ") |         results.Add("        iq.sl_eflag, "); | ||||||
|             .AppendLine("        iq.sl_eflag, ") |         results.Add("        iq.sl_scal, "); | ||||||
|             .AppendLine("        iq.sl_scal, ") |         results.Add("        iq.sl_sls, "); | ||||||
|             .AppendLine("        iq.sl_sls, ") |         results.Add("        iq.sl_usl "); | ||||||
|             .AppendLine("        iq.sl_usl ") |         results.Add(" from ( "); | ||||||
|             .AppendLine(" from ( ") |         results.Add(" select "); | ||||||
|             .AppendLine(" select ") |         results.Add("       se.f_sgrp se_sgrp, "); | ||||||
|             .AppendLine("       se.f_sgrp se_sgrp, ") |         results.Add("       se.f_sgtm se_sgtm, "); | ||||||
|             .AppendLine("       se.f_sgtm se_sgtm, ") |         results.Add("       se.f_tsno se_tsno, "); | ||||||
|             .AppendLine("       se.f_tsno se_tsno, ") |         results.Add("       se.f_val se_val, "); | ||||||
|             .AppendLine("       se.f_val se_val, ") |         results.Add("       pr.f_name pr_name, "); | ||||||
|             .AppendLine("       pr.f_name pr_name, ") |         results.Add("       jd.f_name jd_name, "); | ||||||
|             .AppendLine("       jd.f_name jd_name, ") |         results.Add("       pl.f_name pl_name, "); | ||||||
|             .AppendLine("       pl.f_name pl_name, ") |         results.Add("       pd.f_name pd_name, "); | ||||||
|             .AppendLine("       pd.f_name pd_name, ") |         results.Add("       td.f_test td_test, "); | ||||||
|             .AppendLine("       td.f_test td_test, ") |         results.Add("       td.f_name td_name, "); | ||||||
|             .AppendLine("       td.f_name td_name, ") |         results.Add("       sl.f_eflag sl_eflag, "); | ||||||
|             .AppendLine("       sl.f_eflag sl_eflag, ") |         results.Add("       sl.f_aflag sl_aflag, "); | ||||||
|             .AppendLine("       sl.f_aflag sl_aflag, ") |         results.Add("       sl.f_scal sl_scal, "); | ||||||
|             .AppendLine("       sl.f_scal sl_scal, ") |         results.Add("       sl.f_lsl sl_sls, "); | ||||||
|             .AppendLine("       sl.f_lsl sl_sls, ") |         results.Add("       sl.f_usl sl_usl, "); | ||||||
|             .AppendLine("       sl.f_usl sl_usl, ") |         results.Add("       case when sl.f_aflag is null or sl.f_aflag = 0 then null else "); | ||||||
|             .AppendLine("       case when sl.f_aflag is null or sl.f_aflag = 0 then null else ") |         results.Add("         case when round(se.f_val, sl.F_scal, 1) < sl.f_lsl then 1 else 0 end "); | ||||||
|             .AppendLine("         case when round(se.f_val, sl.F_scal, 1) < sl.f_lsl then 1 else 0 end ") |         results.Add("       end as sl_loos, "); | ||||||
|             .AppendLine("       end as sl_loos, ") |         results.Add("       case when sl.f_aflag is null or sl.f_aflag = 0 then null else "); | ||||||
|             .AppendLine("       case when sl.f_aflag is null or sl.f_aflag = 0 then null else ") |         results.Add("         case when round(se.f_val, sl.F_scal, 1) > sl.f_usl then 1 else 0 end "); | ||||||
|             .AppendLine("         case when round(se.f_val, sl.F_scal, 1) > sl.f_usl then 1 else 0 end ") |         results.Add("       end as sl_uoos, "); | ||||||
|             .AppendLine("       end as sl_uoos, ") |         results.Add("       (select count(ev.f_evnt) "); | ||||||
|             .AppendLine("       (select count(ev.f_evnt) ") |         results.Add("       from [spcepiworld].[dbo].[evnt_inf] ev "); | ||||||
|             .AppendLine("       from [spcepiworld].[dbo].[evnt_inf] ev ") |         results.Add("       where ev.f_prcs = pr.f_prcs "); | ||||||
|             .AppendLine("       where ev.f_prcs = pr.f_prcs ") |         results.Add("         and ev.f_part = pd.f_part "); | ||||||
|             .AppendLine("         and ev.f_part = pd.f_part ") |         results.Add("         and ev.f_sgtm = se.f_sgtm "); | ||||||
|             .AppendLine("         and ev.f_sgtm = se.f_sgtm ") |         results.Add("       ) ev_count "); | ||||||
|             .AppendLine("       ) ev_count ") |         results.Add(" from [spcepiworld].[dbo].[sgrp_ext] se "); | ||||||
|             .AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ") |         results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ") |         results.Add("   on se.f_prcs = pr.f_prcs "); | ||||||
|             .AppendLine("   on se.f_prcs = pr.f_prcs ") |         results.Add(" join [spcepiworld].[dbo].[job_dat] jd "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[job_dat] jd ") |         results.Add("   on se.f_job = jd.f_job "); | ||||||
|             .AppendLine("   on se.f_job = jd.f_job ") |         results.Add(" join [spcepiworld].[dbo].[part_lot] pl "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[part_lot] pl ") |         results.Add("   on se.f_lot = pl.f_lot "); | ||||||
|             .AppendLine("   on se.f_lot = pl.f_lot ") |         results.Add(" join [spcepiworld].[dbo].[part_dat] pd "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ") |         results.Add("   on se.f_part = pd.f_part "); | ||||||
|             .AppendLine("   on se.f_part = pd.f_part ") |         results.Add(" join [spcepiworld].[dbo].[test_dat] td "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[test_dat] td ") |         results.Add("   on se.f_test = td.f_test "); | ||||||
|             .AppendLine("   on se.f_test = td.f_test ") |         results.Add(" left join [spcepiworld].[dbo].[spec_lim] sl "); | ||||||
|             .AppendLine(" left join [spcepiworld].[dbo].[spec_lim] sl ") |         results.Add("   on se.f_part = sl.f_part "); | ||||||
|             .AppendLine("   on se.f_part = sl.f_part ") |         results.Add("  and se.f_test = sl.f_test "); | ||||||
|             .AppendLine("  and se.f_test = sl.f_test ") |         results.Add(" where se.f_flag = 0 "); | ||||||
|             .AppendLine(" where se.f_flag = 0 ") |         results.Add("   and (sl.f_prcs is null or se.f_prcs = sl.f_prcs or sl.f_prcs = 0) "); | ||||||
|             .AppendLine("   and (sl.f_prcs is null or se.f_prcs = sl.f_prcs or sl.f_prcs = 0) "); |  | ||||||
|         if (!string.IsNullOrEmpty(subGroupId)) |         if (!string.IsNullOrEmpty(subGroupId)) | ||||||
|             _ = result.Append("   and se.f_sgrp = ").Append(subGroupId.Split(" ")[0]).AppendLine("  "); |             results.Add($"   and se.f_sgrp = {subGroupId.Split(" ")[0]} "); | ||||||
|         if (!string.IsNullOrEmpty(process)) |         if (!string.IsNullOrEmpty(process)) | ||||||
|             _ = result.Append("   and pr.f_name = '").Append(process).AppendLine("' "); |             results.Add($"   and pr.f_name = '{process}' "); | ||||||
|         if (!string.IsNullOrEmpty(part)) |         if (!string.IsNullOrEmpty(part)) | ||||||
|             _ = result.Append("   and pd.f_name = '").Append(part).AppendLine("' "); |             results.Add($"   and pd.f_name = '{part}' "); | ||||||
|         if (!string.IsNullOrEmpty(job)) |         if (!string.IsNullOrEmpty(job)) | ||||||
|             _ = result.Append("   and jd.f_name = '").Append(job).AppendLine("' "); |             results.Add($"   and jd.f_name = '{job}' "); | ||||||
|         if (!string.IsNullOrEmpty(lot)) |         if (!string.IsNullOrEmpty(lot)) | ||||||
|             _ = result.Append("   and pl.f_name = '").Append(lot).AppendLine("' "); |             results.Add($"   and pl.f_name = '{lot}' "); | ||||||
|         if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':'))) |         if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':'))) | ||||||
|             _ = result.Append("   and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '").Append(dateTime).AppendLine("' "); |             results.Add($"   and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '{dateTime}' "); | ||||||
|         _ = result.AppendLine(" ) as iq ") |         results.Add(" ) as iq "); | ||||||
|                   .AppendLine(" order by iq.sl_loos + iq.sl_uoos + iq.ev_count desc, ") |         results.Add(" order by iq.sl_loos + iq.sl_uoos + iq.ev_count desc, "); | ||||||
|                   .AppendLine("          iq.sl_aflag desc, ") |         results.Add("          iq.sl_aflag desc, "); | ||||||
|                   .AppendLine("          iq.se_sgrp, ") |         results.Add("          iq.se_sgrp, "); | ||||||
|                   .AppendLine("          iq.se_tsno, ") |         results.Add("          iq.se_tsno, "); | ||||||
|                   .AppendLine("          iq.td_test ") |         results.Add("          iq.td_test "); | ||||||
|                   .AppendLine("   for json path "); |         results.Add("   for json path "); | ||||||
|         return result.ToString(); |         return string.Join(' ', results); | ||||||
|     } // cSpell:enable |     } // cSpell:enable | ||||||
|  |  | ||||||
|  |     private JsonElement[] GetAllReactorsAsJsonElementElement() | ||||||
|  |     { | ||||||
|  |         JsonElement[]? results; | ||||||
|  |         HttpClient httpClient = _HttpClientFactory.CreateClient(); | ||||||
|  |         Task<string> task = httpClient.GetStringAsync($"{_OpenInsightApplicationProgrammingInterface}/reactors"); | ||||||
|  |         task.Wait(); | ||||||
|  |         JsonElement? jsonElement = JsonSerializer.Deserialize<JsonElement>(task.Result); | ||||||
|  |         if (jsonElement is null) | ||||||
|  |             throw new NullReferenceException(nameof(jsonElement)); | ||||||
|  |         string json = jsonElement.Value.EnumerateObject().First().Value.ToString(); | ||||||
|  |         results = JsonSerializer.Deserialize<JsonElement[]>(json); | ||||||
|  |         if (results is null) | ||||||
|  |             throw new NullReferenceException(nameof(results)); | ||||||
|  |         return results; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText, bool useIqsConnection) |     private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText, bool useIqsConnection) | ||||||
|     { |     { | ||||||
|         StringBuilder stringBuilder = new(); |         StringBuilder stringBuilder = new(); | ||||||
|  |         File.WriteAllText("../../.sql", commandText); | ||||||
|         using DbConnection dbConnection = dbConnectionFactory.GetDbConnection(useIqsConnection); |         using DbConnection dbConnection = dbConnectionFactory.GetDbConnection(useIqsConnection); | ||||||
|         DbCommand dbCommand = dbConnection.CreateCommand(); |         DbCommand dbCommand = dbConnection.CreateCommand(); | ||||||
|         dbCommand.CommandText = commandText; |         dbCommand.CommandText = commandText; | ||||||
| @ -165,6 +179,50 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository | |||||||
|         return stringBuilder; |         return stringBuilder; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private void GetOI(InfinityQSV4 infinityQSV4) | ||||||
|  |     { | ||||||
|  |         IInfinityQSV4Repository infinityQSV4Repository = this; | ||||||
|  |         if (string.IsNullOrEmpty(infinityQSV4.Part)) | ||||||
|  |             throw new ArgumentException(nameof(infinityQSV4.Part)); | ||||||
|  |         string json = infinityQSV4Repository.GetProductionSpecification(infinityQSV4.Part); | ||||||
|  |         File.WriteAllText("../../.json", json); | ||||||
|  |         ProdSpecRoot? prodSpec = JsonSerializer.Deserialize(json, ProdSpecRootSourceGenerationContext.Default.ProdSpecRoot); | ||||||
|  |         if (prodSpec is null) | ||||||
|  |         { | ||||||
|  |             if (prodSpec is null) | ||||||
|  |             { } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private static List<string> Convert(int[] night) | ||||||
|  |     { | ||||||
|  |         List<string> results = new(); | ||||||
|  |         foreach (int reactor in night) | ||||||
|  |             results.Add(reactor.ToString()); | ||||||
|  |         return results; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     private ReadOnlyDictionary<int, Reactor> GetReactorsMatchingType(string? reactTypeFilter) | ||||||
|  |     { | ||||||
|  |         Dictionary<int, Reactor> results = new(); | ||||||
|  |         string json; | ||||||
|  |         Reactor? reactor; | ||||||
|  |         JsonElement[]? jsonElements = GetAllReactorsAsJsonElementElement(); | ||||||
|  |         foreach (JsonElement jsonElement in jsonElements) | ||||||
|  |         { | ||||||
|  |             json = jsonElement.EnumerateObject().First().Value.ToString(); | ||||||
|  |             if (reactTypeFilter is not null && !json.Contains(reactTypeFilter)) | ||||||
|  |                 continue; | ||||||
|  |             try | ||||||
|  |             { reactor = JsonSerializer.Deserialize(json, ReactorSourceGenerationContext.Default.Reactor); } | ||||||
|  |             catch (Exception) { reactor = null; } | ||||||
|  |             if (reactor is null || (reactTypeFilter is not null && reactor.ReactType != reactTypeFilter)) | ||||||
|  |                 continue; | ||||||
|  |             results.Add(reactor.ReactorNo, reactor); | ||||||
|  |         } | ||||||
|  |         return new(results); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     private static InfinityQSV4 GetInfinityQSV4(IDbConnectionFactory dbConnectionFactory, IInfinityQSV4Repository infinityQSV4Repository, string subGroupId) |     private static InfinityQSV4 GetInfinityQSV4(IDbConnectionFactory dbConnectionFactory, IInfinityQSV4Repository infinityQSV4Repository, string subGroupId) | ||||||
|     { |     { | ||||||
|         InfinityQSV4 result; |         InfinityQSV4 result; | ||||||
| @ -235,33 +293,32 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository | |||||||
|  |  | ||||||
|     string IInfinityQSV4Repository.GetCommandText(InfinityQSV4 infinityQSV4) |     string IInfinityQSV4Repository.GetCommandText(InfinityQSV4 infinityQSV4) | ||||||
|     { // cSpell:disable |     { // cSpell:disable | ||||||
|         StringBuilder result = new(); |         List<string> results = []; | ||||||
|         if (string.IsNullOrEmpty(infinityQSV4.Process)) |         if (string.IsNullOrEmpty(infinityQSV4.Process)) | ||||||
|             throw new ArgumentException(nameof(infinityQSV4.Process)); |             throw new ArgumentException(nameof(infinityQSV4.Process)); | ||||||
|         if (string.IsNullOrEmpty(infinityQSV4.Part)) |         if (string.IsNullOrEmpty(infinityQSV4.Part)) | ||||||
|             throw new ArgumentException(nameof(infinityQSV4.Part)); |             throw new ArgumentException(nameof(infinityQSV4.Part)); | ||||||
|         _ = result |         results.Add(" select "); | ||||||
|             .AppendLine(" select ") |         results.Add(" ev.f_evnt [ev_evnt], "); | ||||||
|             .AppendLine(" ev.f_evnt [ev_evnt], ") |         results.Add(" ev.f_sgtm [ev_sgtm], "); | ||||||
|             .AppendLine(" ev.f_sgtm [ev_sgtm], ") |         results.Add(" dateadd(HH, -7, (dateadd(SS, convert(bigint, ev.f_sgtm), '19700101'))) [ev_utc7], "); | ||||||
|             .AppendLine(" dateadd(HH, -7, (dateadd(SS, convert(bigint, ev.f_sgtm), '19700101'))) [ev_utc7], ") |         results.Add(" pr.f_name [pr_name], "); | ||||||
|             .AppendLine(" pr.f_name [pr_name], ") |         results.Add(" pd.f_name [pd_name], "); | ||||||
|             .AppendLine(" pd.f_name [pd_name], ") |         results.Add(" td.f_test [td_test], "); | ||||||
|             .AppendLine(" td.f_test [td_test], ") |         results.Add(" td.f_name [td_name], "); | ||||||
|             .AppendLine(" td.f_name [td_name], ") |         results.Add(" ev.f_name [ev_name] "); | ||||||
|             .AppendLine(" ev.f_name [ev_name] ") |         results.Add(" from [spcepiworld].[dbo].[evnt_inf] ev "); | ||||||
|             .AppendLine(" from [spcepiworld].[dbo].[evnt_inf] ev ") |         results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ") |         results.Add(" on ev.f_prcs = pr.f_prcs "); | ||||||
|             .AppendLine(" on ev.f_prcs = pr.f_prcs ") |         results.Add(" join [spcepiworld].[dbo].[part_dat] pd "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ") |         results.Add(" on ev.f_part = pd.f_part "); | ||||||
|             .AppendLine(" on ev.f_part = pd.f_part ") |         results.Add(" join [spcepiworld].[dbo].[test_dat] td "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[test_dat] td ") |         results.Add(" on ev.f_test = td.f_test "); | ||||||
|             .AppendLine(" on ev.f_test = td.f_test ") |         results.Add($" where pr.f_name = '{infinityQSV4.Process}' "); | ||||||
|             .Append(" where pr.f_name = '").Append(infinityQSV4.Process).AppendLine("' ") |         results.Add($" and pd.f_name = '{infinityQSV4.Part}' "); | ||||||
|             .Append(" and pd.f_name = '").Append(infinityQSV4.Part).AppendLine("' ") |         results.Add($" and ev.f_sgtm = {infinityQSV4.SubGroupDateTime} "); | ||||||
|             .Append(" and ev.f_sgtm = ").Append(infinityQSV4.SubGroupDateTime).AppendLine(" ") |         results.Add(" for json path "); | ||||||
|             .AppendLine(" for json path "); |         return string.Join(' ', results); | ||||||
|         return result.ToString(); |  | ||||||
|     } // cSpell:enable |     } // cSpell:enable | ||||||
|  |  | ||||||
|     Result<InfinityQSV4[]> IInfinityQSV4Repository.GetHeader(string subGroupId) |     Result<InfinityQSV4[]> IInfinityQSV4Repository.GetHeader(string subGroupId) | ||||||
| @ -290,28 +347,27 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository | |||||||
|  |  | ||||||
|     string IInfinityQSV4Repository.GetCommandText(string process, string? part) |     string IInfinityQSV4Repository.GetCommandText(string process, string? part) | ||||||
|     { // cSpell:disable |     { // cSpell:disable | ||||||
|         StringBuilder result = new(); |         List<string> results = []; | ||||||
|         if (string.IsNullOrEmpty(process)) |         if (string.IsNullOrEmpty(process)) | ||||||
|             throw new ArgumentException(null, nameof(process)); |             throw new ArgumentException(null, nameof(process)); | ||||||
|         if (string.IsNullOrEmpty(part)) |         if (string.IsNullOrEmpty(part)) | ||||||
|             throw new ArgumentException(null, nameof(part)); |             throw new ArgumentException(null, nameof(part)); | ||||||
|         _ = result |         results.Add(" select [f_mean] as ProcessMean, "); | ||||||
|             .AppendLine(" select [f_mean] as ProcessMean, ") |         results.Add("        [f_sp] as ProcessSigma "); | ||||||
|             .AppendLine("        [f_sp] as ProcessSigma ") |         results.Add(" from [spcepiworld].[dbo].[test_dat] test "); | ||||||
|             .AppendLine(" from [spcepiworld].[dbo].[test_dat] test ") |         results.Add(" join [spcepiworld].[dbo].[ctrl_lim] ctrl "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[ctrl_lim] ctrl ") |         results.Add("   on test.f_test = ctrl.f_test "); | ||||||
|             .AppendLine("   on test.f_test = ctrl.f_test ") |         results.Add("   and test.f_tsgp = 1104848523 /* Product Data */ "); | ||||||
|             .AppendLine("   and test.f_tsgp = 1104848523 /* Product Data */ ") |         results.Add(" join [spcepiworld].[dbo].[part_dat] part "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[part_dat] part ") |         results.Add("   on part.f_part = ctrl.f_part "); | ||||||
|             .AppendLine("   on part.f_part = ctrl.f_part ") |         results.Add("  and ctrl.f_test = 1125073605 /* Average Sum of Defects */ "); | ||||||
|             .AppendLine("  and ctrl.f_test = 1125073605 /* Average Sum of Defects */ ") |         results.Add(" join [spcepiworld].[dbo].[prcs_dat] process "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] process ") |         results.Add("   on process.f_prcs = ctrl.f_prcs "); | ||||||
|             .AppendLine("   on process.f_prcs = ctrl.f_prcs ") |         results.Add(" where test.f_name = 'Average Sum of Defects' "); | ||||||
|             .AppendLine(" where test.f_name = 'Average Sum of Defects' ") |         results.Add($"       and process.f_name = '{process}' "); | ||||||
|             .Append("       and process.f_name = '").Append(process).AppendLine("' ") |         results.Add($"       and part.f_name = '{part}' "); | ||||||
|             .Append("       and part.f_name = '").Append(part).AppendLine("' ") |         results.Add(" for json path; "); | ||||||
|             .AppendLine(" for json path; "); |         return string.Join(' ', results); | ||||||
|         return result.ToString(); |  | ||||||
|     } // cSpell:enable |     } // cSpell:enable | ||||||
|  |  | ||||||
|     string IInfinityQSV4Repository.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe) |     string IInfinityQSV4Repository.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe) | ||||||
| @ -333,102 +389,56 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository | |||||||
|         return result.ToString(); |         return result.ToString(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private JsonElement[] GetAllReactorsAsJsonElementElement() |  | ||||||
|     { |  | ||||||
|         JsonElement[]? results; |  | ||||||
|         HttpClient httpClient = _HttpClientFactory.CreateClient(); |  | ||||||
|         Task<string> task = httpClient.GetStringAsync($"{_OpenInsightApplicationProgrammingInterface}/reactors"); |  | ||||||
|         task.Wait(); |  | ||||||
|         JsonElement? jsonElement = JsonSerializer.Deserialize<JsonElement>(task.Result); |  | ||||||
|         if (jsonElement is null) |  | ||||||
|             throw new NullReferenceException(nameof(jsonElement)); |  | ||||||
|         string json = jsonElement.Value.EnumerateObject().First().Value.ToString(); |  | ||||||
|         results = JsonSerializer.Deserialize<JsonElement[]>(json); |  | ||||||
|         if (results is null) |  | ||||||
|             throw new NullReferenceException(nameof(results)); |  | ||||||
|         return results; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private ReadOnlyDictionary<int, Reactor> GetReactorsMatchingType(string? reactTypeFilter) |  | ||||||
|     { |  | ||||||
|         Dictionary<int, Reactor> results = new(); |  | ||||||
|         string json; |  | ||||||
|         Reactor? reactor; |  | ||||||
|         JsonElement[]? jsonElements = GetAllReactorsAsJsonElementElement(); |  | ||||||
|         foreach (JsonElement jsonElement in jsonElements) |  | ||||||
|         { |  | ||||||
|             json = jsonElement.EnumerateObject().First().Value.ToString(); |  | ||||||
|             if (reactTypeFilter is not null && !json.Contains(reactTypeFilter)) |  | ||||||
|                 continue; |  | ||||||
|             try |  | ||||||
|             { reactor = JsonSerializer.Deserialize(json, ReactorSourceGenerationContext.Default.Reactor); } |  | ||||||
|             catch (Exception) { reactor = null; } |  | ||||||
|             if (reactor is null || (reactTypeFilter is not null && reactor.ReactType != reactTypeFilter)) |  | ||||||
|                 continue; |  | ||||||
|             results.Add(reactor.ReactorNo, reactor); |  | ||||||
|         } |  | ||||||
|         return new(results); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     string IInfinityQSV4Repository.GetCommandText(List<string> eppReactorNumbers) |     string IInfinityQSV4Repository.GetCommandText(List<string> eppReactorNumbers) | ||||||
|     { // cSpell:disable |     { // cSpell:disable | ||||||
|         StringBuilder result = new(); |         List<string> results = []; | ||||||
|         _ = result |         results.Add(" select se.f_sgrp, "); | ||||||
|             .AppendLine(" select se.f_sgrp, ") |         results.Add("        dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgrp), '19700101'))) date_time, "); | ||||||
|             .AppendLine("        dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgrp), '19700101'))) date_time, ") |         results.Add("        iq.pr_name, "); | ||||||
|             .AppendLine("        iq.pr_name, ") |         results.Add("        iq.pd_name, "); | ||||||
|             .AppendLine("        iq.pd_name, ") |         results.Add("        max(case "); | ||||||
|             .AppendLine("        max(case ") |         results.Add("         when td.f_test = 1104769646 "); | ||||||
|             .AppendLine("         when td.f_test = 1104769646 ") |         results.Add("         then se.f_val "); | ||||||
|             .AppendLine("         then se.f_val ") |         results.Add("         else null "); | ||||||
|             .AppendLine("         else null ") |         results.Add("         end) as iq_value, "); | ||||||
|             .AppendLine("         end) as iq_value, ") |         results.Add("        max(case "); | ||||||
|             .AppendLine("        max(case ") |         results.Add("         when td.f_test = 1312288843 "); | ||||||
|             .AppendLine("         when td.f_test = 1312288843 ") |         results.Add("         then se.f_val else null "); | ||||||
|             .AppendLine("         then se.f_val else null ") |         results.Add("         end) as iq_temp_offset_percent "); | ||||||
|             .AppendLine("         end) as iq_temp_offset_percent ") |         results.Add(" from ( "); | ||||||
|             .AppendLine(" from ( ") |         results.Add(" select "); | ||||||
|             .AppendLine(" select ") |         results.Add("       max(se.f_sgrp) se_max_sgrp, "); | ||||||
|             .AppendLine("       max(se.f_sgrp) se_max_sgrp, ") |         results.Add("       se.f_test se_test, "); | ||||||
|             .AppendLine("       se.f_test se_test, ") |         results.Add("       pr.f_name pr_name, "); | ||||||
|             .AppendLine("       pr.f_name pr_name, ") |         results.Add("       pd.f_name pd_name "); | ||||||
|             .AppendLine("       pd.f_name pd_name ") |         results.Add(" from [spcepiworld].[dbo].[sgrp_ext] se "); | ||||||
|             .AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ") |         results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ") |         results.Add("   on se.f_prcs = pr.f_prcs "); | ||||||
|             .AppendLine("   on se.f_prcs = pr.f_prcs ") |         results.Add(" join [spcepiworld].[dbo].[part_dat] pd "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ") |         results.Add("   on se.f_part = pd.f_part "); | ||||||
|             .AppendLine("   on se.f_part = pd.f_part ") |         results.Add(" where se.f_flag = 0 "); | ||||||
|             .AppendLine(" where se.f_flag = 0 ") |         results.Add($"   and pr.f_name in ({string.Join(',', eppReactorNumbers)}) "); | ||||||
|             .Append("   and pr.f_name in (").Append(string.Join(',', eppReactorNumbers)).AppendLine(") ") |         results.Add("   and pd.f_name = '1090 - Full Load' "); | ||||||
|             .AppendLine("   and pd.f_name = '1090 - Full Load' ") |         results.Add("   and se.f_test in (1104769646, 1312288843) "); | ||||||
|             .AppendLine("   and se.f_test in (1104769646, 1312288843) ") |         results.Add(" group by se.f_test, "); | ||||||
|             .AppendLine(" group by se.f_test, ") |         results.Add("          pr.f_name, "); | ||||||
|             .AppendLine("          pr.f_name, ") |         results.Add("          pd.f_name "); | ||||||
|             .AppendLine("          pd.f_name ") |         results.Add(" ) as iq "); | ||||||
|             .AppendLine(" ) as iq ") |         results.Add(" join [spcepiworld].[dbo].[sgrp_ext] se "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[sgrp_ext] se ") |         results.Add("   on iq.se_max_sgrp = se.f_sgrp "); | ||||||
|             .AppendLine("   on iq.se_max_sgrp = se.f_sgrp ") |         results.Add(" join [spcepiworld].[dbo].[test_dat] td "); | ||||||
|             .AppendLine(" join [spcepiworld].[dbo].[test_dat] td ") |         results.Add("   on iq.se_test = td.f_test "); | ||||||
|             .AppendLine("   on iq.se_test = td.f_test ") |         results.Add("  and se.f_test = td.f_test "); | ||||||
|             .AppendLine("  and se.f_test = td.f_test ") |         results.Add(" where se.f_flag = 0 "); | ||||||
|             .AppendLine(" where se.f_flag = 0 ") |         results.Add("   and td.f_test in (1104769646, 1312288843) "); | ||||||
|             .AppendLine("   and td.f_test in (1104769646, 1312288843) ") |         results.Add(" group by se.f_sgrp, "); | ||||||
|             .AppendLine(" group by se.f_sgrp, ") |         results.Add("          iq.pr_name, "); | ||||||
|             .AppendLine("          iq.pr_name, ") |         results.Add("          iq.pd_name "); | ||||||
|             .AppendLine("          iq.pd_name ") |         results.Add(" order by iq.pr_name "); | ||||||
|             .AppendLine(" order by iq.pr_name ") |         results.Add(" for json path; "); | ||||||
|             .AppendLine(" for json path; "); |         return string.Join(' ', results); | ||||||
|         return result.ToString(); |  | ||||||
|     } // cSpell:enable |     } // cSpell:enable | ||||||
|  |  | ||||||
|     private static List<string> Convert(int[] night) |  | ||||||
|     { |  | ||||||
|         List<string> results = new(); |  | ||||||
|         foreach (int reactor in night) |  | ||||||
|             results.Add(reactor.ToString()); |  | ||||||
|         return results; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     List<string[]> IInfinityQSV4Repository.GetEpiProTempVerificationRows(int[] night) |     List<string[]> IInfinityQSV4Repository.GetEpiProTempVerificationRows(int[] night) | ||||||
|     { |     { | ||||||
|         List<string[]>? results; |         List<string[]>? results; | ||||||
| @ -638,171 +648,55 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository | |||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void GetOI(InfinityQSV4 infinityQSV4) |     private static string GetCommandText(string process, string? part, int? test) | ||||||
|     { |     { // cSpell:disable | ||||||
|         IInfinityQSV4Repository infinityQSV4Repository = this; |         List<string> results = []; | ||||||
|         if (string.IsNullOrEmpty(infinityQSV4.Part)) |         if (string.IsNullOrEmpty(process)) | ||||||
|             throw new ArgumentException(nameof(infinityQSV4.Part)); |             throw new ArgumentException(null, nameof(process)); | ||||||
|         string json = infinityQSV4Repository.GetProductionSpecification(infinityQSV4.Part); |         if (string.IsNullOrEmpty(part)) | ||||||
|         ProdSpecRoot? prodSpec = JsonSerializer.Deserialize(json, ProdSpecRootSourceGenerationContext.Default.ProdSpecRoot); |             throw new ArgumentException(null, nameof(part)); | ||||||
|         if (prodSpec is null) |         if (test is null) | ||||||
|         { |             throw new ArgumentException(null, nameof(test)); | ||||||
|             if (prodSpec is null) |         results.Add(" select se_max_sgrp, se.f_val se_value "); | ||||||
|             { } |         results.Add(" from ( "); | ||||||
|         } |         results.Add("   select "); | ||||||
|     } |         results.Add("         max(se.f_sgrp) se_max_sgrp "); | ||||||
|  |         results.Add("   from [spcepiworld].[dbo].[sgrp_ext] se "); | ||||||
|  |         results.Add("   join [spcepiworld].[dbo].[prcs_dat] pr "); | ||||||
|  |         results.Add("     on se.f_prcs = pr.f_prcs "); | ||||||
|  |         results.Add("   join [spcepiworld].[dbo].[part_dat] pd "); | ||||||
|  |         results.Add("     on se.f_part = pd.f_part "); | ||||||
|  |         results.Add("   where se.f_flag = 0 "); | ||||||
|  |         results.Add("     and se.f_tsno = 1 "); | ||||||
|  |         results.Add($"     and pr.f_name = '{process}' "); | ||||||
|  |         results.Add($"     and pd.f_name = '{part}' "); | ||||||
|  |         results.Add($"     and se.f_test = {test.Value} "); | ||||||
|  |         results.Add(" ) as iq "); | ||||||
|  |         results.Add(" join [spcepiworld].[dbo].[sgrp_ext] se "); | ||||||
|  |         results.Add("   on se_max_sgrp = se.f_sgrp "); | ||||||
|  |         results.Add(" where se.f_flag = 0 "); | ||||||
|  |         results.Add("   and se.f_tsno = 1 "); | ||||||
|  |         results.Add($"   and se.f_test = {test.Value} "); | ||||||
|  |         results.Add(" for json path "); | ||||||
|  |         return string.Join(' ', results); | ||||||
|  |     } // cSpell:enable | ||||||
|  |  | ||||||
|     private static Record? GetValue(AppSettings appSettings, string line) |     string IInfinityQSV4Repository.GetLastGroupIdWithValue(string process, string? part, int? test) | ||||||
|     { |     { | ||||||
|         Record? result; |         StringBuilder result; | ||||||
|         string[] attributes = line.Split('>'); |  | ||||||
|         if (attributes.Length != 3) |  | ||||||
|             result = null; |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             string[] text = attributes[1].Replace(appSettings.IqsRed, "red").Replace(appSettings.IqsYellow, "Yellow").Split($"</{line[1]}{line[2]}"); |  | ||||||
|             if (text.Length != 2) |  | ||||||
|                 result = null; |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 string[] attributeValues = attributes[0].Split('"'); |  | ||||||
|                 if (attributeValues.Length != 3) |  | ||||||
|                     result = new(null, text[0]); |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     result = new(attributeValues[1], text[0]); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private static ReadOnlyCollection<Record> GetRecords(AppSettings appSettings, string[] lines) |  | ||||||
|     { |  | ||||||
|         Record? record; |  | ||||||
|         List<Record> results = new(); |  | ||||||
|         List<string> checkColumns = new(); |  | ||||||
|         foreach (string line in lines) |  | ||||||
|         { |  | ||||||
|             if (line.StartsWith("<th")) |  | ||||||
|             { |  | ||||||
|                 record = GetValue(appSettings, line); |  | ||||||
|                 if (record is null) |  | ||||||
|                     continue; |  | ||||||
|                 checkColumns.Add(record.Text); |  | ||||||
|             } |  | ||||||
|             if (line.StartsWith("<td")) |  | ||||||
|             { |  | ||||||
|                 record = GetValue(appSettings, line); |  | ||||||
|                 if (record is null) |  | ||||||
|                     continue; |  | ||||||
|                 results.Add(record); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         if (string.Join(',', checkColumns) != appSettings.IqsColumns) |  | ||||||
|             throw new NotSupportedException("Columns don't match!"); |  | ||||||
|         return new(results); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private static List<Dictionary<string, Record>> GetCollection(string columns, ReadOnlyCollection<Record> records) |  | ||||||
|     { |  | ||||||
|         string[] columnNames = columns.Split(','); |  | ||||||
|         List<Dictionary<string, Record>> collection = new(); |  | ||||||
|         Dictionary<string, Record> keyValuePairs; |  | ||||||
|         for (int i = 0; i < records.Count; i++) |  | ||||||
|         { |  | ||||||
|             keyValuePairs = new(); |  | ||||||
|             for (int j = 0; j < columnNames.Length; j++) |  | ||||||
|             { |  | ||||||
|                 keyValuePairs.Add(columnNames[j], records[i]); |  | ||||||
|                 i++; |  | ||||||
|             } |  | ||||||
|             i--; |  | ||||||
|             collection.Add(keyValuePairs); |  | ||||||
|         } |  | ||||||
|         return collection; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private static Dictionary<string, List<string>> GetResults(AppSettings appSettings, List<Dictionary<string, Record>> collection) |  | ||||||
|     { |  | ||||||
|         Dictionary<string, List<string>> results = new(); |  | ||||||
|         Record record; |  | ||||||
|         List<string>? colors; |  | ||||||
|         foreach (Dictionary<string, Record> keyValuePairs in collection) |  | ||||||
|         { |  | ||||||
|             record = keyValuePairs[appSettings.IqsKey]; |  | ||||||
|             if (!results.TryGetValue(record.Text, out colors)) |  | ||||||
|             { |  | ||||||
|                 results.Add(record.Text, new()); |  | ||||||
|                 if (!results.TryGetValue(record.Text, out colors)) |  | ||||||
|                     throw new Exception(); |  | ||||||
|             } |  | ||||||
|             if (record.Color is null) |  | ||||||
|                 continue; |  | ||||||
|             colors.Add(record.Color.Replace(appSettings.IqsRed, "red").Replace(appSettings.IqsYellow, "Yellow")); |  | ||||||
|         } |  | ||||||
|         foreach (KeyValuePair<string, List<string>> keyValuePair in results) |  | ||||||
|             keyValuePair.Value.Sort(); |  | ||||||
|         return results; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private void FileFindReplaceAndSave(FileInfo fileInfo, string value) |  | ||||||
|     { |  | ||||||
|         string lines = value.Replace(_AppSettings.IqsRed, "red").Replace(_AppSettings.IqsYellow, "Yellow"); |  | ||||||
|         File.WriteAllText(fileInfo.FullName, lines); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private static string GetWwwRootDirectory() |  | ||||||
|     { |  | ||||||
|         string result; |  | ||||||
|         Assembly assembly = Assembly.GetExecutingAssembly(); |  | ||||||
|         string? assemblyName = assembly.GetName()?.Name; |  | ||||||
|         if (string.IsNullOrEmpty(assemblyName)) |  | ||||||
|             throw new Exception(); |  | ||||||
|         result = Path.Combine(AppContext.BaseDirectory, "wwwroot"); |  | ||||||
|         if (!Directory.Exists(result)) |  | ||||||
|             _ = Directory.CreateDirectory(result); |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     Dictionary<string, List<string>> IInfinityQSV4Repository.GetEngineeringSpcReview() |  | ||||||
|     { |  | ||||||
|         Dictionary<string, List<string>>? results; |  | ||||||
|         if (!string.IsNullOrEmpty(_MockRoot)) |         if (!string.IsNullOrEmpty(_MockRoot)) | ||||||
|         { |         { | ||||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetEngineeringSpcReview)}.json")); |             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetLastGroupIdWithValue)}.json")); | ||||||
|             results = JsonSerializer.Deserialize<Dictionary<string, List<string>>>(json); |             result = new(json); | ||||||
|             if (results is null) |  | ||||||
|                 throw new NullReferenceException(nameof(results)); |  | ||||||
|         } |         } | ||||||
|         else |         else | ||||||
|         { |         { | ||||||
|             string wwwRootDirectory = GetWwwRootDirectory(); |             string commandText = GetCommandText(process, part, test); | ||||||
|             HttpClient httpClient = _HttpClientFactory.CreateClient(); |             result = GetForJsonPath(_DBConnectionFactory, commandText, useIqsConnection: false); | ||||||
|             FileInfo localFileInfo = new(Path.Combine(wwwRootDirectory, _AppSettings.IqsFileSegments.Last())); |             if (result.Length == 0) | ||||||
|             Uri uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareCharacterizationSi), _AppSettings.IqsFileSegments[0..^1]); |                 result = new("{}"); | ||||||
|             List<NginxFileSystemSortable> nginxFileSystemSortableCollection = _FileShareRepository.GetNginxFileSystemSortableCollection(httpClient, uri, ".html"); |  | ||||||
|             if (!localFileInfo.Exists && nginxFileSystemSortableCollection.Count == 0) |  | ||||||
|                 results = new(); |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 string[] lines; |  | ||||||
|                 HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, nginxFileSystemSortableCollection[0].Uri); |  | ||||||
|                 Task<string> value = httpResponseMessage.Content.ReadAsStringAsync(); |  | ||||||
|                 value.Wait(); |  | ||||||
|                 if (localFileInfo.Exists && localFileInfo.LastWriteTime == nginxFileSystemSortableCollection[0].DateTime) |  | ||||||
|                     lines = File.ReadAllLines(localFileInfo.FullName); |  | ||||||
|                 else |  | ||||||
|                 { |  | ||||||
|                     FileFindReplaceAndSave(localFileInfo, value.Result); |  | ||||||
|                     lines = value.Result.Split("\r\n"); |  | ||||||
|                 } |  | ||||||
|                 ReadOnlyCollection<Record> records = GetRecords(_AppSettings, lines); |  | ||||||
|                 List<Dictionary<string, Record>> collection = GetCollection(_AppSettings.IqsColumns, records); |  | ||||||
|                 results = GetResults(_AppSettings, collection); |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         return results; |         return result.ToString(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -16,6 +16,7 @@ namespace OI.Metrology.Server.Repositories; | |||||||
|  |  | ||||||
| public class MetrologyRepository : IMetrologyRepository | public class MetrologyRepository : IMetrologyRepository | ||||||
| { | { | ||||||
|  |  | ||||||
|     private readonly string _MockRoot; |     private readonly string _MockRoot; | ||||||
|     private readonly string _RepositoryName; |     private readonly string _RepositoryName; | ||||||
|     private readonly IMemoryCache _MemoryCache; |     private readonly IMemoryCache _MemoryCache; | ||||||
| @ -32,7 +33,8 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|     protected DbProviderFactory GetDbProviderFactory(IDbConnection conn) => |     protected DbProviderFactory GetDbProviderFactory(IDbConnection conn) => | ||||||
|         DbProviderFactories.GetFactory(conn.GetType().Namespace); |         DbProviderFactories.GetFactory(conn.GetType().Namespace); | ||||||
|  |  | ||||||
|     internal static TransactionScope StartTransaction() => new(); |     internal static TransactionScope StartTransaction() => | ||||||
|  |         new(); | ||||||
|  |  | ||||||
|     protected void CacheItem(string key, object v) |     protected void CacheItem(string key, object v) | ||||||
|     { |     { | ||||||
| @ -56,7 +58,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return r; |         return r; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal ToolType GetToolTypeByName(string name) |     ToolType IMetrologyRepository.GetToolTypeByName(string name) | ||||||
|     { |     { | ||||||
|         ToolType cached; |         ToolType cached; | ||||||
|         string cacheKey = "GetToolTypeByName_" + name; |         string cacheKey = "GetToolTypeByName_" + name; | ||||||
| @ -107,7 +109,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return r; |         return r; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal long InsertToolDataJSON(JToken jsonrow, long headerId, List<ToolTypeMetadata> metaData, string tableName) |     long IMetrologyRepository.InsertToolDataJSON(JToken jsonrow, long headerId, List<ToolTypeMetadata> metaData, string tableName) | ||||||
|     { |     { | ||||||
|         long r = -1; |         long r = -1; | ||||||
|         using (DbConnection conn = _DBConnectionFactory.GetDbConnection()) |         using (DbConnection conn = _DBConnectionFactory.GetDbConnection()) | ||||||
| @ -115,7 +117,8 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|             bool isHeader = headerId <= 0; |             bool isHeader = headerId <= 0; | ||||||
|  |  | ||||||
|             // get fields from metadata |             // get fields from metadata | ||||||
|             List<ToolTypeMetadata> fields = metaData.Where(md => md.Header == isHeader).ToList(); |             List<ToolTypeMetadata> fields = metaData.Where(md => | ||||||
|  |                 md.Header == isHeader).ToList(); | ||||||
|  |  | ||||||
|             // maps ApiName to ColumnName |             // maps ApiName to ColumnName | ||||||
|             Dictionary<string, string> fieldmap = new(); |             Dictionary<string, string> fieldmap = new(); | ||||||
| @ -155,7 +158,8 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|             else |             else | ||||||
|             { |             { | ||||||
|                 // Find the container field in the json |                 // Find the container field in the json | ||||||
|                 JProperty contJP = jsonrow.Children<JProperty>().Where(c => string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); |                 JProperty contJP = jsonrow.Children<JProperty>().Where(c => | ||||||
|  |                     string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); | ||||||
|  |  | ||||||
|                 if ((contJP is not null) && (contJP.Value is JArray array)) |                 if ((contJP is not null) && (contJP.Value is JArray array)) | ||||||
|                 { |                 { | ||||||
| @ -182,7 +186,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         _ = cmd.Parameters.Add(p); |         _ = cmd.Parameters.Add(p); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     protected long InsertRowFromJSON( |     private long InsertRowFromJSON( | ||||||
|         IDbConnection conn, |         IDbConnection conn, | ||||||
|         string tableName, |         string tableName, | ||||||
|         JToken jsonrow, |         JToken jsonrow, | ||||||
| @ -262,7 +266,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return Convert.ToInt64(o); |         return Convert.ToInt64(o); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal DataTable ExportData(string spName, DateTime startTime, DateTime endTime) |     DataTable IMetrologyRepository.ExportData(string spName, DateTime startTime, DateTime endTime) | ||||||
|     { |     { | ||||||
|         DataTable dt = new(); |         DataTable dt = new(); | ||||||
|         DateTime endTimeLocal = endTime.ToLocalTime(); |         DateTime endTimeLocal = endTime.ToLocalTime(); | ||||||
| @ -312,7 +316,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return sb.ToString(); |         return sb.ToString(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal DataTable GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords) |     DataTable IMetrologyRepository.GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
| @ -324,7 +328,8 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|             StringBuilder sb = new(); |             StringBuilder sb = new(); | ||||||
|             _ = sb.Append( |             _ = sb.Append( | ||||||
|                 FormDynamicSelectQuery( |                 FormDynamicSelectQuery( | ||||||
|                     md.Where(m => m.Header == true).ToList(), |                     md.Where(m => | ||||||
|  |                         m.Header == true).ToList(), | ||||||
|                     tt.HeaderTableName) |                     tt.HeaderTableName) | ||||||
|             ); |             ); | ||||||
|  |  | ||||||
| @ -401,7 +406,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return dt; |         return dt; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal DataTable GetData(int toolTypeId, long headerid) |     DataTable IMetrologyRepository.GetData(int toolTypeId, long headerid) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
| @ -413,7 +418,9 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|             StringBuilder sb = new(); |             StringBuilder sb = new(); | ||||||
|             _ = sb.Append( |             _ = sb.Append( | ||||||
|                 FormDynamicSelectQuery( |                 FormDynamicSelectQuery( | ||||||
|                     md.Where(m => m.Header == false).OrderBy(m => m.GridDisplayOrder).ToList(), |                     md.Where(m => | ||||||
|  |                         m.Header == false).OrderBy(m => | ||||||
|  |                         m.GridDisplayOrder).ToList(), | ||||||
|                     tt.DataTableName) |                     tt.DataTableName) | ||||||
|             ); |             ); | ||||||
|  |  | ||||||
| @ -492,17 +499,32 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return dt; |         return dt; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal Guid GetHeaderAttachmentID(int toolTypeId, long headerId) |     Guid IMetrologyRepository.GetHeaderAttachmentID(int toolTypeId, long headerId) | ||||||
|  |     { | ||||||
|  |         Guid result; | ||||||
|  |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
|  |         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); | ||||||
|  |         string sql = | ||||||
|  |             $"SELECT AttachmentID FROM [{tt.HeaderTableName}] WHERE ID = @HeaderID"; | ||||||
|  |         result = conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId }); | ||||||
|  |         return result; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     void IMetrologyRepository.SetHeaderAttachmentID(int toolTypeId, long headerId, string attachmentId) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
|         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); |         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); | ||||||
|         string sql = |         string sql = | ||||||
|             $"UPDATE [{tt.HeaderTableName}] SET AttachmentID = NEWID() WHERE ID = @HeaderID AND AttachmentID IS NULL; " + |             $"UPDATE [{tt.HeaderTableName}] SET AttachmentID = @AttachmentID WHERE ID = @HeaderID AND AttachmentID IS NULL; " + | ||||||
|             $"SELECT AttachmentID FROM [{tt.HeaderTableName}] WHERE ID = @HeaderID"; |             $"SELECT AttachmentID FROM [{tt.HeaderTableName}] WHERE ID = @HeaderID"; | ||||||
|         return conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId }); |         Guid guid = conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, AttachmentID = attachmentId }); | ||||||
|  |         if (attachmentId != guid.ToString()) | ||||||
|  |             throw new NotSupportedException($"{attachmentId} != {guid}"); | ||||||
|     } |     } | ||||||
|     internal string GetHeaderInsertDate(int toolTypeId, long headerId) |  | ||||||
|  |     string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
| @ -511,7 +533,8 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|             $"SELECT CONVERT(varchar, case when [InsertDate] < [Date] or [Date] is null then [InsertDate] else [Date] end, 120) d FROM[{tt.HeaderTableName}] where ID = @HeaderID"; |             $"SELECT CONVERT(varchar, case when [InsertDate] < [Date] or [Date] is null then [InsertDate] else [Date] end, 120) d FROM[{tt.HeaderTableName}] where ID = @HeaderID"; | ||||||
|         return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId }); |         return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId }); | ||||||
|     } |     } | ||||||
|     internal string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId) |  | ||||||
|  |     string IMetrologyRepository.GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId) | ||||||
|     { |     { | ||||||
|         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); |         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); | ||||||
|         string sql = ""; |         string sql = ""; | ||||||
| @ -526,24 +549,27 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|  |  | ||||||
|         return conn.ExecuteScalar<string>(sql, param: new { AttachmentID = attachmentId }); |         return conn.ExecuteScalar<string>(sql, param: new { AttachmentID = attachmentId }); | ||||||
|     } |     } | ||||||
|     internal void SetHeaderDirName(string tableName, long headerId, string dateDir) |  | ||||||
|  |     void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir) | ||||||
|     { |     { | ||||||
|         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); |         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); | ||||||
|         _ = conn.Execute($"UPDATE [{tableName}] SET AttachDirName = @AttachDirName WHERE ID = @HeaderID;", new { HeaderID = headerId, AttachDirName = dateDir }); |         _ = conn.Execute($"UPDATE [{tableName}] SET AttachDirName = @AttachDirName WHERE ID = @HeaderID;", new { HeaderID = headerId, AttachDirName = dateDir }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal Guid GetDataAttachmentID(int toolTypeId, long headerId, string title) |     void IMetrologyRepository.SetDataAttachmentID(int toolTypeId, long headerId, string title, string attachmentId) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
|         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); |         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); | ||||||
|         string sql = |         string sql = | ||||||
|             $"UPDATE [{tt.DataTableName}] SET AttachmentID = NEWID() WHERE HeaderID = @HeaderID AND Title = @Title AND AttachmentID IS NULL; " + |             $"UPDATE [{tt.DataTableName}] SET AttachmentID = @AttachmentID WHERE HeaderID = @HeaderID AND Title = @Title AND AttachmentID IS NULL; " + | ||||||
|             $"SELECT AttachmentID FROM [{tt.DataTableName}] WHERE HeaderID = @HeaderID AND Title = @Title"; |             $"SELECT AttachmentID FROM [{tt.DataTableName}] WHERE HeaderID = @HeaderID AND Title = @Title"; | ||||||
|         return conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, Title = title }); |         Guid guid = conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, AttachmentID = attachmentId, Title = title }); | ||||||
|  |         if (attachmentId != guid.ToString()) | ||||||
|  |             throw new NotSupportedException($"{attachmentId} != {guid}"); | ||||||
|     } |     } | ||||||
|     // J Ouellette Added |  | ||||||
|     internal string GetDataInsertDate(int toolTypeId, long headerId, string title) |     string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
| @ -560,7 +586,8 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|  |  | ||||||
|         return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId, Title = title }); |         return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId, Title = title }); | ||||||
|     } |     } | ||||||
|     internal void SetDataDirName(string tableName, long headerId, string title, string dateDir) |  | ||||||
|  |     void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir) | ||||||
|     { |     { | ||||||
|         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); |         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); | ||||||
|         string sql = |         string sql = | ||||||
| @ -568,13 +595,13 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         _ = conn.Execute(sql, param: new { HeaderID = headerId, Title = title, AttachDirName = dateDir }); |         _ = conn.Execute(sql, param: new { HeaderID = headerId, Title = title, AttachDirName = dateDir }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal void PurgeExistingData(int toolTypeId, string title) |     void IMetrologyRepository.PurgeExistingData(int toolTypeId, string title) | ||||||
|     { |     { | ||||||
|         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); |         using DbConnection conn = _DBConnectionFactory.GetDbConnection(); | ||||||
|         _ = conn.Execute("PurgeExistingData", param: new { ToolTypeID = toolTypeId, Title = title }, commandType: CommandType.StoredProcedure); |         _ = conn.Execute("PurgeExistingData", param: new { ToolTypeID = toolTypeId, Title = title }, commandType: CommandType.StoredProcedure); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal DataSet GetOIExportData(int toolTypeId, long headerid) |     DataSet IMetrologyRepository.GetOIExportData(int toolTypeId, long headerid) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
| @ -626,7 +653,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return results.ToArray(); |         return results.ToArray(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords) |     HeaderCommon[] IMetrologyRepository.GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords) | ||||||
|     { |     { | ||||||
|         HeaderCommon[] headers; |         HeaderCommon[] headers; | ||||||
|         if (toolTypeId is not null && (pageNo is not null || pageSize is not null)) |         if (toolTypeId is not null && (pageNo is not null || pageSize is not null)) | ||||||
| @ -662,7 +689,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return headers; |         return headers; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid) |     IEnumerable<KeyValuePair<string, string>> IMetrologyRepository.GetHeaderFields(int toolTypeId, long headerid) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
| @ -689,7 +716,9 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|             if (dt.Rows.Count > 0) |             if (dt.Rows.Count > 0) | ||||||
|                 dr = dt.Rows[0]; |                 dr = dt.Rows[0]; | ||||||
|  |  | ||||||
|             foreach (ToolTypeMetadata m in md.Where(m => m.Header == true && m.TableDisplayOrder > 0).OrderBy(m => m.TableDisplayOrder)) |             foreach (ToolTypeMetadata m in md.Where(m => | ||||||
|  |                 m.Header == true && m.TableDisplayOrder > 0).OrderBy(m => | ||||||
|  |                 m.TableDisplayOrder)) | ||||||
|             { |             { | ||||||
|                 string v = ""; |                 string v = ""; | ||||||
|                 if (dr is not null) |                 if (dr is not null) | ||||||
| @ -705,7 +734,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return r; |         return r; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal IEnumerable<AwaitingDisposition> GetAwaitingDisposition() |     IEnumerable<AwaitingDisposition> IMetrologyRepository.GetAwaitingDisposition() | ||||||
|     { |     { | ||||||
|         IEnumerable<AwaitingDisposition>? r; |         IEnumerable<AwaitingDisposition>? r; | ||||||
|         if (!string.IsNullOrEmpty(_MockRoot)) |         if (!string.IsNullOrEmpty(_MockRoot)) | ||||||
| @ -723,7 +752,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return r; |         return r; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) |     int IMetrologyRepository.UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
| @ -743,7 +772,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title) |     Guid IMetrologyRepository.GetHeaderAttachmentIDByTitle(int toolTypeId, string title) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
| @ -753,7 +782,7 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return conn.ExecuteScalar<Guid>(sql, param: new { Title = title }); |         return conn.ExecuteScalar<Guid>(sql, param: new { Title = title }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     internal Guid GetDataAttachmentIDByTitle(int toolTypeId, string title) |     Guid IMetrologyRepository.GetDataAttachmentIDByTitle(int toolTypeId, string title) | ||||||
|     { |     { | ||||||
|         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|  |  | ||||||
| @ -763,31 +792,13 @@ public class MetrologyRepository : IMetrologyRepository | |||||||
|         return conn.ExecuteScalar<Guid>(sql, param: new { Title = title }); |         return conn.ExecuteScalar<Guid>(sql, param: new { Title = title }); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     DataTable IMetrologyRepository.GetDataSharePoint(int toolTypeId, string headerId) => throw new NotImplementedException(); |     IEnumerable<ToolType> IMetrologyRepository.GetToolTypes() => | ||||||
|  |         GetToolTypes(); | ||||||
|     IEnumerable<ToolType> IMetrologyRepository.GetToolTypes() => GetToolTypes(); |     ToolType IMetrologyRepository.GetToolTypeByID(int id) => | ||||||
|     ToolType IMetrologyRepository.GetToolTypeByName(string name) => GetToolTypeByName(name); |         GetToolTypeByID(id); | ||||||
|     ToolType IMetrologyRepository.GetToolTypeByID(int id) => GetToolTypeByID(id); |     TransactionScope IMetrologyRepository.StartTransaction() => | ||||||
|     IEnumerable<ToolTypeMetadata> IMetrologyRepository.GetToolTypeMetadataByToolTypeID(int id) => GetToolTypeMetadataByToolTypeID(id); |         StartTransaction(); | ||||||
|     TransactionScope IMetrologyRepository.StartTransaction() => StartTransaction(); |     IEnumerable<ToolTypeMetadata> IMetrologyRepository.GetToolTypeMetadataByToolTypeID(int id) => | ||||||
|     void IMetrologyRepository.PurgeExistingData(int toolTypeId, string title) => PurgeExistingData(toolTypeId, title); |         GetToolTypeMetadataByToolTypeID(id); | ||||||
|     long IMetrologyRepository.InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName) => InsertToolDataJSON(jsonbody, headerId, metaData, tableName); |  | ||||||
|     DataTable IMetrologyRepository.ExportData(string spName, DateTime startTime, DateTime endTime) => ExportData(spName, startTime, endTime); |  | ||||||
|     DataTable IMetrologyRepository.GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords) => GetHeaders(toolTypeId, startTime, endTime, pageNo, pageSize, headerid, out totalRecords); |  | ||||||
|     DataTable IMetrologyRepository.GetData(int toolTypeId, long headerId) => GetData(toolTypeId, headerId); |  | ||||||
|     HeaderCommon[] IMetrologyRepository.GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords) => GetHeaderTitles(toolTypeId, pageNo, pageSize, out totalRecords); |  | ||||||
|     Guid IMetrologyRepository.GetHeaderAttachmentIDByTitle(int toolTypeId, string title) => GetHeaderAttachmentIDByTitle(toolTypeId, title); |  | ||||||
|     Guid IMetrologyRepository.GetDataAttachmentIDByTitle(int toolTypeId, string title) => GetDataAttachmentIDByTitle(toolTypeId, title); |  | ||||||
|     Guid IMetrologyRepository.GetHeaderAttachmentID(int toolTypeId, long headerId) => GetHeaderAttachmentID(toolTypeId, headerId); |  | ||||||
|     string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId) => GetHeaderInsertDate(toolTypeId, headerId); |  | ||||||
|     string IMetrologyRepository.GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId) => GetAttachmentInsertDateByGUID(tableName, attachmentId); |  | ||||||
|     void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir) => SetHeaderDirName(tableName, headerId, dateDir); |  | ||||||
|     Guid IMetrologyRepository.GetDataAttachmentID(int toolTypeId, long headerId, string title) => GetDataAttachmentID(toolTypeId, headerId, title); |  | ||||||
|     string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title) => GetDataInsertDate(toolTypeId, headerId, title); |  | ||||||
|     void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir) => SetDataDirName(tableName, headerId, title, dateDir); |  | ||||||
|     DataSet IMetrologyRepository.GetOIExportData(int toolTypeId, long headerid) => GetOIExportData(toolTypeId, headerid); |  | ||||||
|     IEnumerable<KeyValuePair<string, string>> IMetrologyRepository.GetHeaderFields(int toolTypeId, long headerid) => GetHeaderFields(toolTypeId, headerid); |  | ||||||
|     IEnumerable<AwaitingDisposition> IMetrologyRepository.GetAwaitingDisposition() => GetAwaitingDisposition(); |  | ||||||
|     int IMetrologyRepository.UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) => UpdateReviewDate(toolTypeId, headerId, clearDate); |  | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -3,7 +3,6 @@ using OI.Metrology.Shared.DataModels; | |||||||
| using OI.Metrology.Shared.Models.Stateless; | using OI.Metrology.Shared.Models.Stateless; | ||||||
| using OI.Metrology.Shared.Services; | using OI.Metrology.Shared.Services; | ||||||
| using System.Data; | using System.Data; | ||||||
| using System.Text; |  | ||||||
| using System.Text.Json; | using System.Text.Json; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.Repository; | namespace OI.Metrology.Server.Repository; | ||||||
| @ -237,96 +236,4 @@ public class ToolTypesRepository : IToolTypesRepository | |||||||
|         return result; |         return result; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     Result<DataTable> IToolTypesRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend) |  | ||||||
|     { |  | ||||||
|         Result<DataTable>? r; |  | ||||||
|         if (!string.IsNullOrEmpty(_MockRoot)) |  | ||||||
|         { |  | ||||||
|             string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IToolTypesRepository.GetExportData)}.json")); |  | ||||||
|             r = Newtonsoft.Json.JsonConvert.DeserializeObject<Result<DataTable>>(json); |  | ||||||
|             if (r is null) |  | ||||||
|                 throw new NullReferenceException(nameof(r)); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             DateTime dateEnd = dateend is null ? DateTime.Now : DateTime.Parse(dateend); |  | ||||||
|             DateTime dateBegin = datebegin is null ? dateEnd.AddMonths(-1) : DateTime.Parse(datebegin); |  | ||||||
|             ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId); |  | ||||||
|             if (string.IsNullOrEmpty(tt.ExportSPName)) |  | ||||||
|                 throw new NullReferenceException(nameof(tt.ExportSPName)); |  | ||||||
|             DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, dateBegin, dateEnd); |  | ||||||
|             r = new() |  | ||||||
|             { |  | ||||||
|                 Results = dataTable, |  | ||||||
|                 TotalRows = dataTable.Rows.Count, |  | ||||||
|             }; |  | ||||||
|         } |  | ||||||
|         return r; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     protected static string FormatForCSV(string v) |  | ||||||
|     { |  | ||||||
|         StringBuilder result = new(v.Length + 2); |  | ||||||
|         bool doubleQuoted = false; |  | ||||||
|         if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"')) |  | ||||||
|         { |  | ||||||
|             _ = result.Append('"'); |  | ||||||
|             doubleQuoted = true; |  | ||||||
|         } |  | ||||||
|         foreach (char c in v) |  | ||||||
|         { |  | ||||||
|             _ = c switch |  | ||||||
|             { |  | ||||||
|                 '\r' or '\n' => result.Append(' '), |  | ||||||
|                 '"' => result.Append("\"\""), |  | ||||||
|                 _ => result.Append(c), |  | ||||||
|             }; |  | ||||||
|         } |  | ||||||
|         if (doubleQuoted) |  | ||||||
|             _ = result.Append('"'); |  | ||||||
|         return result.ToString(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     protected static string GetColumnHeaders(DataTable dataTable) |  | ||||||
|     { |  | ||||||
|         StringBuilder result = new(); |  | ||||||
|         for (int i = 0; i < dataTable.Columns.Count; i++) |  | ||||||
|         { |  | ||||||
|             if (i > 0) |  | ||||||
|                 _ = result.Append(','); |  | ||||||
|             _ = result.Append(FormatForCSV(dataTable.Columns[i].ColumnName.TrimEnd('_'))); |  | ||||||
|         } |  | ||||||
|         return result.ToString(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     protected static string GetRowData(DataRow dr) |  | ||||||
|     { |  | ||||||
|         StringBuilder result = new(); |  | ||||||
|         for (int i = 0; i < dr.Table.Columns.Count; i++) |  | ||||||
|         { |  | ||||||
|             if (i > 0) |  | ||||||
|                 _ = result.Append(','); |  | ||||||
|             object v = dr[i]; |  | ||||||
|             if (v is not null && !Convert.IsDBNull(v)) |  | ||||||
|                 _ = result.Append(FormatForCSV(string.Concat(Convert.ToString(v)))); |  | ||||||
|         } |  | ||||||
|         return result.ToString(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     byte[] IToolTypesRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend) |  | ||||||
|     { |  | ||||||
|         byte[] results; |  | ||||||
|         Result<DataTable> result; |  | ||||||
|         IToolTypesRepository repository = this; |  | ||||||
|         result = repository.GetExportData(metrologyRepository, toolTypeId, datebegin, dateend); |  | ||||||
|         if (result.Results is null) |  | ||||||
|             throw new NullReferenceException(nameof(result.Results)); |  | ||||||
|         StringBuilder stringBuilder = new(); |  | ||||||
|         _ = stringBuilder.AppendLine(GetColumnHeaders(result.Results)); |  | ||||||
|         foreach (DataRow dr in result.Results.Rows) |  | ||||||
|             _ = stringBuilder.AppendLine(GetRowData(dr)); |  | ||||||
|         results = Encoding.UTF8.GetBytes(stringBuilder.ToString()); |  | ||||||
|         return results; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -1,211 +0,0 @@ | |||||||
| using OI.Metrology.Server.Models; |  | ||||||
| using OI.Metrology.Shared.DataModels; |  | ||||||
| using OI.Metrology.Shared.Models; |  | ||||||
| using OI.Metrology.Shared.Models.Stateless; |  | ||||||
| using OI.Metrology.Shared.Repositories; |  | ||||||
| using System.Globalization; |  | ||||||
|  |  | ||||||
| namespace OI.Metrology.Server.Repository; |  | ||||||
|  |  | ||||||
| public class WaferCounterRepository : IWaferCounterRepository |  | ||||||
| { |  | ||||||
|  |  | ||||||
|     private record Record(int Check, |  | ||||||
|                           int Total, |  | ||||||
|                           string? SlotMap); |  | ||||||
|  |  | ||||||
|     private readonly string _MockRoot; |  | ||||||
|     private readonly string _RepositoryName; |  | ||||||
|     private readonly AppSettings _AppSettings; |  | ||||||
|     private readonly IHttpClientFactory _HttpClientFactory; |  | ||||||
|     private readonly IDbConnectionFactory _DBConnectionFactory; |  | ||||||
|     private readonly IFileShareRepository _FileShareRepository; |  | ||||||
|     private readonly string _OpenInsightApplicationProgrammingInterface; |  | ||||||
|  |  | ||||||
|     public WaferCounterRepository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory, IHttpClientFactory httpClientFactory, IFileShareRepository fileShareRepository) |  | ||||||
|     { |  | ||||||
|         _AppSettings = appSettings; |  | ||||||
|         _MockRoot = appSettings.MockRoot; |  | ||||||
|         _HttpClientFactory = httpClientFactory; |  | ||||||
|         _DBConnectionFactory = dbConnectionFactory; |  | ||||||
|         _FileShareRepository = fileShareRepository; |  | ||||||
|         _RepositoryName = nameof(WaferCounterRepository)[..^10]; |  | ||||||
|         _OpenInsightApplicationProgrammingInterface = appSettings.OpenInsightApplicationProgrammingInterface; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private void MoveFile(string waferSizeDirectory, NginxFileSystemSortable nginxFileSystemSortable) |  | ||||||
|     { |  | ||||||
|         Calendar calendar = new CultureInfo("en-US").Calendar; |  | ||||||
|         string from = Path.Combine(waferSizeDirectory, nginxFileSystemSortable.Name); |  | ||||||
|         string weekOfYear = $"{nginxFileSystemSortable.DateTime:yyyy}_Week_{calendar.GetWeekOfYear(nginxFileSystemSortable.DateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday):00}"; |  | ||||||
|         string to = Path.Combine(waferSizeDirectory, "Archive", weekOfYear, nginxFileSystemSortable.Name); |  | ||||||
|         _FileShareRepository.MoveFile(from, to); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private static Record GetRecord(string line1, string line2) |  | ||||||
|     { |  | ||||||
|         Record result; |  | ||||||
|         string? waferMap = string.IsNullOrEmpty(line2) || line2.Length != 8 ? null : line2.Substring(1, 1); |  | ||||||
|         int check = waferMap == "1" ? 1 : 0; |  | ||||||
|         int total = int.Parse(line1[1..]); |  | ||||||
|         // string wafers = Array.from(line2[2..]); |  | ||||||
|         foreach (char item in line2[2..]) |  | ||||||
|         { |  | ||||||
|             switch (item) |  | ||||||
|             { |  | ||||||
|                 case '0': |  | ||||||
|                     check += 0; |  | ||||||
|                     waferMap += "0000"; |  | ||||||
|                     break; |  | ||||||
|                 case '1': |  | ||||||
|                     check += 1; |  | ||||||
|                     waferMap += "0001"; |  | ||||||
|                     break; |  | ||||||
|                 case '2': |  | ||||||
|                     check += 1; |  | ||||||
|                     waferMap += "0010"; |  | ||||||
|                     break; |  | ||||||
|                 case '3': |  | ||||||
|                     check += 2; |  | ||||||
|                     waferMap += "0011"; |  | ||||||
|                     break; |  | ||||||
|                 case '4': |  | ||||||
|                     check += 1; |  | ||||||
|                     waferMap += "0100"; |  | ||||||
|                     break; |  | ||||||
|                 case '5': |  | ||||||
|                     check += 2; |  | ||||||
|                     waferMap += "0101"; |  | ||||||
|                     break; |  | ||||||
|                 case '6': |  | ||||||
|                     check += 2; |  | ||||||
|                     waferMap += "0110"; |  | ||||||
|                     break; |  | ||||||
|                 case '7': |  | ||||||
|                     check += 3; |  | ||||||
|                     waferMap += "0111"; |  | ||||||
|                     break; |  | ||||||
|                 case '8': |  | ||||||
|                     check += 1; |  | ||||||
|                     waferMap += "1000"; |  | ||||||
|                     break; |  | ||||||
|                 case '9': |  | ||||||
|                     check += 2; |  | ||||||
|                     waferMap += "1001"; |  | ||||||
|                     break; |  | ||||||
|                 case 'A': |  | ||||||
|                     check += 2; |  | ||||||
|                     waferMap += "1010"; |  | ||||||
|                     break; |  | ||||||
|                 case 'B': |  | ||||||
|                     check += 3; |  | ||||||
|                     waferMap += "1011"; |  | ||||||
|                     break; |  | ||||||
|                 case 'C': |  | ||||||
|                     check += 2; |  | ||||||
|                     waferMap += "1100"; |  | ||||||
|                     break; |  | ||||||
|                 case 'D': |  | ||||||
|                     check += 3; |  | ||||||
|                     waferMap += "1101"; |  | ||||||
|                     break; |  | ||||||
|                 case 'E': |  | ||||||
|                     check += 3; |  | ||||||
|                     waferMap += "1110"; |  | ||||||
|                     break; |  | ||||||
|                 case 'F': |  | ||||||
|                     check += 4; |  | ||||||
|                     waferMap += "1111"; |  | ||||||
|                     break; |  | ||||||
|                 default: |  | ||||||
|                     break; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         result = new(check, total, waferMap); |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private Uri GetWaferSizeUri(string area, string waferSize) => |  | ||||||
|         _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareCharacterizationSi), "WaferCounter", area, waferSize); |  | ||||||
|  |  | ||||||
|     private string GetWaferSizeDirectory(string area, string waferSize, bool destination) => |  | ||||||
|         destination ? Path.Combine(_AppSettings.WaferCounterDestinationDirectory, area, waferSize) : Path.Combine(_AppSettings.EcCharacterizationSi, "WaferCounter", area, waferSize); |  | ||||||
|  |  | ||||||
|     string? IWaferCounterRepository.GetSlotMap(string line1, string line2) => |  | ||||||
|         GetRecord(line1, line2).SlotMap; |  | ||||||
|  |  | ||||||
|     private List<NginxFileSystemSortable> GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri waferSizeUri, string waferSizeDirectory) |  | ||||||
|     { |  | ||||||
|         List<NginxFileSystemSortable> results = new(); |  | ||||||
|         DateTime dateTime = DateTime.Now; |  | ||||||
|         long ticks = dateTime.AddSeconds(_AppSettings.WaferCounterTwoFileSecondsWait).Ticks; |  | ||||||
|         for (int i = 0; i < int.MaxValue; i++) |  | ||||||
|         { |  | ||||||
|             results = _FileShareRepository.GetNginxFileSystemSortableCollection(httpClient, waferSizeUri, ".wc"); |  | ||||||
|             if (results.Count > 1 || DateTime.Now.Ticks > ticks) |  | ||||||
|                 break; |  | ||||||
|             Thread.Sleep(250); |  | ||||||
|         } |  | ||||||
|         for (int i = 1; i < results.Count; i++) |  | ||||||
|             MoveFile(waferSizeDirectory, results[i]); |  | ||||||
|         return results; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private static WaferCounter GetLastQuantityAndSlotMapWithText(string waferSize, string text, HttpClient httpClient, NginxFileSystemSortable nginxFileSystemSortable) |  | ||||||
|     { |  | ||||||
|         WaferCounter result; |  | ||||||
|         Task<string> value = httpClient.GetStringAsync(nginxFileSystemSortable.Uri); |  | ||||||
|         value.Wait(); |  | ||||||
|         string[] lines = value.Result.Split("\r\n"); |  | ||||||
|         if (lines.Length <= 1) |  | ||||||
|             throw new Exception("Incomplete file length!"); |  | ||||||
|         string[] segments = nginxFileSystemSortable.Name.Split('-'); |  | ||||||
|         Record record = GetRecord(lines[0], lines[1]); |  | ||||||
|         string equipmentId = segments.Length <= 1 ? nginxFileSystemSortable.Name : segments[1].Split('.')[0]; |  | ||||||
|         if (string.IsNullOrEmpty(record.SlotMap) || record.SlotMap.Length != 25) |  | ||||||
|             throw new Exception("Wrong length!"); |  | ||||||
|         if (record.Total != record.Check) |  | ||||||
|             throw new Exception("Invalid!"); |  | ||||||
|         result = new(nginxFileSystemSortable.DateTime, nginxFileSystemSortable.DateTime.ToString("yyyy-MM-dd hh:mm tt"), $"WC{waferSize}{equipmentId}", text, record.Total, record.SlotMap); |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     WaferCounter IWaferCounterRepository.GetLastQuantityAndSlotMap(string area, string waferSize) |  | ||||||
|     { |  | ||||||
|         WaferCounter result; |  | ||||||
|         Uri waferSizeUri = GetWaferSizeUri(area, waferSize); |  | ||||||
|         HttpClient httpClient = _HttpClientFactory.CreateClient(); |  | ||||||
|         string waferSizeDirectory = GetWaferSizeDirectory(area, waferSize, destination: false); |  | ||||||
|         List<NginxFileSystemSortable> nginxFileSystemSortableCollection = GetNginxFileSystemSortableCollection(httpClient, waferSizeUri, waferSizeDirectory); |  | ||||||
|         if (nginxFileSystemSortableCollection.Count < 1) |  | ||||||
|             throw new Exception("No files!"); |  | ||||||
|         string text = string.Empty; |  | ||||||
|         result = GetLastQuantityAndSlotMapWithText(waferSize, text, httpClient, nginxFileSystemSortableCollection[0]); |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private void Save(string waferSizeDestinationDirectory, string area, string waferSize, string text, NginxFileSystemSortable nginxFileSystemSortable, WaferCounter result) => |  | ||||||
|         _FileShareRepository.FileWrite(Path.Combine(waferSizeDestinationDirectory, $"{nginxFileSystemSortable.Name}.csv"), $"100,{waferSize},{area},{nginxFileSystemSortable.DateTime},{text},{result.Total:00},{result.SlotMap} "); |  | ||||||
|  |  | ||||||
|     WaferCounter IWaferCounterRepository.GetLastQuantityAndSlotMapWithText(string area, string waferSize, string text) |  | ||||||
|     { |  | ||||||
|         WaferCounter result; |  | ||||||
|         Uri waferSizeUri = GetWaferSizeUri(area, waferSize); |  | ||||||
|         HttpClient httpClient = _HttpClientFactory.CreateClient(); |  | ||||||
|         string waferSizeDirectory = GetWaferSizeDirectory(area, waferSize, destination: false); |  | ||||||
|         List<NginxFileSystemSortable> nginxFileSystemSortableCollection = GetNginxFileSystemSortableCollection(httpClient, waferSizeUri, waferSizeDirectory); |  | ||||||
|         if (nginxFileSystemSortableCollection.Count < 1) |  | ||||||
|             throw new Exception("No files!"); |  | ||||||
|         result = GetLastQuantityAndSlotMapWithText(waferSize, text, httpClient, nginxFileSystemSortableCollection[0]); |  | ||||||
|         if (result is not null) |  | ||||||
|         { |  | ||||||
|             string waferSizeDestinationDirectory = _AppSettings.WaferCounterDestinationDirectory; |  | ||||||
|             // string waferSizeDestinationDirectory = GetWaferSizeUri(area, waferSize, destination: true); |  | ||||||
|             Save(waferSizeDestinationDirectory, area, waferSize, text, nginxFileSystemSortableCollection[0], result); |  | ||||||
|         } |  | ||||||
|         if (result is null) |  | ||||||
|             throw new NullReferenceException(nameof(result)); |  | ||||||
|         return result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } |  | ||||||
| @ -39,7 +39,7 @@ public class AttachmentsService : IAttachmentsService | |||||||
|         HttpClient httpClient = _HttpClientFactory.CreateClient(); |         HttpClient httpClient = _HttpClientFactory.CreateClient(); | ||||||
|         Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi); |         Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi); | ||||||
|         int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); |         int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); | ||||||
|         Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename); |         Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, "MetrologyAttachments", $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename); | ||||||
|         HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, uri); |         HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, uri); | ||||||
|         if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK) |         if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK) | ||||||
|             throw new Exception("File not found!"); |             throw new Exception("File not found!"); | ||||||
| @ -77,63 +77,36 @@ public class AttachmentsService : IAttachmentsService | |||||||
|         return GetAttachmentStream(tableName, attachmentId, filename); |         return GetAttachmentStream(tableName, attachmentId, filename); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, IFormFile uploadedFile) |     void IAttachmentsService.SaveAttachment(ToolType toolType, Attachment attachment) | ||||||
|     { |     { | ||||||
|         if (toolType is null) |         if (toolType is null) | ||||||
|             throw new Exception("Invalid tool type"); |             throw new Exception("Invalid tool type"); | ||||||
|  |         if (attachment.HeaderId is null) | ||||||
|         using System.Transactions.TransactionScope trans = _MetrologyRepository.StartTransaction(); |             throw new NullReferenceException($"{nameof(attachment.HeaderId)}"); | ||||||
|         Guid attachmentId = Guid.Empty; |         if (attachment.AttachmentId is null) | ||||||
|         DateTime insertDate = new(); |             throw new NullReferenceException($"{nameof(attachment.AttachmentId)}"); | ||||||
|         string? tableName = ""; |         if (attachment.DestinationFileName is null) | ||||||
|         if (string.IsNullOrWhiteSpace(dataUniqueId)) |             throw new NullReferenceException($"{nameof(attachment.DestinationFileName)}"); | ||||||
|         { |         if (string.IsNullOrWhiteSpace(attachment.UniqueId)) | ||||||
|             attachmentId = _MetrologyRepository.GetHeaderAttachmentID(toolType.ID, headerId); |             throw new NullReferenceException($"{nameof(attachment.UniqueId)}"); | ||||||
|             insertDate = Convert.ToDateTime(_MetrologyRepository.GetHeaderInsertDate(toolType.ID, headerId)); |         if (attachment.DestinationFileName != "Image.pdf") | ||||||
|             tableName = toolType.HeaderTableName; |             _MetrologyRepository.SetHeaderAttachmentID(toolType.ID, attachment.HeaderId.Value, attachment.AttachmentId); | ||||||
|         } |  | ||||||
|         else |         else | ||||||
|         { |             _MetrologyRepository.SetDataAttachmentID(toolType.ID, attachment.HeaderId.Value, attachment.UniqueId, attachment.AttachmentId); | ||||||
|             attachmentId = _MetrologyRepository.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId); |  | ||||||
|             insertDate = Convert.ToDateTime(_MetrologyRepository.GetDataInsertDate(toolType.ID, headerId, dataUniqueId)); |  | ||||||
|             // Get Date for new directory name |  | ||||||
|             tableName = toolType.DataTableName; |  | ||||||
|         } |  | ||||||
|         if (Equals(attachmentId, Guid.Empty)) |  | ||||||
|         { |  | ||||||
|             trans.Dispose(); |  | ||||||
|             throw new Exception("Invalid attachment ID!"); |  | ||||||
|         } |  | ||||||
|         string year = insertDate.Year.ToString(); |  | ||||||
|         HttpClient httpClient = _HttpClientFactory.CreateClient(); |  | ||||||
|         Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi); |  | ||||||
|         int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); |  | ||||||
|         Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename); |  | ||||||
|         HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, uri); |  | ||||||
|         if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK) |  | ||||||
|         { |  | ||||||
|             trans.Dispose(); |  | ||||||
|             throw new Exception("Invalid attachment path!"); |  | ||||||
|         } |  | ||||||
|         uploadedFile.CopyTo(httpResponseMessage.Content.ReadAsStream()); |  | ||||||
|         trans.Complete(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     void IAttachmentsService.SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, object uploadedFile) |  | ||||||
|     { |  | ||||||
|         IFormFile formFile = (IFormFile)uploadedFile; |  | ||||||
|         SaveAttachment(toolType, headerId, dataUniqueId, filename, formFile); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     string? IAttachmentsService.GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId) |     string? IAttachmentsService.GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId) | ||||||
|     { |     { | ||||||
|         string? result; |         string? result; | ||||||
|         int weekNum; |         int weekNum; | ||||||
|  |         string file; | ||||||
|         string year; |         string year; | ||||||
|  |         string directory; | ||||||
|         Task<string> json; |         Task<string> json; | ||||||
|         Uri weekDirectory; |         Uri weekDirectory; | ||||||
|         Uri checkDirectory; |         Uri checkDirectory; | ||||||
|         List<string> files = new(); |         List<string> files = new(); | ||||||
|  |         string[] collection = ["-", string.Empty]; | ||||||
|         NginxFileSystem[]? nginxFileSystemCollection; |         NginxFileSystem[]? nginxFileSystemCollection; | ||||||
|         Task<HttpResponseMessage> httpResponseMessage; |         Task<HttpResponseMessage> httpResponseMessage; | ||||||
|         HttpClient httpClient = _HttpClientFactory.CreateClient(); |         HttpClient httpClient = _HttpClientFactory.CreateClient(); | ||||||
| @ -142,21 +115,32 @@ public class AttachmentsService : IAttachmentsService | |||||||
|         ToolType toolType = metrologyRepository.GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); |         ToolType toolType = metrologyRepository.GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); | ||||||
|         foreach (DateTime dateTime in dateTimes) |         foreach (DateTime dateTime in dateTimes) | ||||||
|         { |         { | ||||||
|             year = dateTime.Year.ToString(); |             foreach (string item in collection) | ||||||
|             weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); |             { | ||||||
|             weekDirectory = _FileShareRepository.Append(mesaFileShareMetrologySi, $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}"); |                 year = dateTime.Year.ToString(); | ||||||
|             checkDirectory = _FileShareRepository.Append(weekDirectory, headerId.ToString()); |                 weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); | ||||||
|             httpResponseMessage = httpClient.GetAsync(checkDirectory); |                 weekDirectory = _FileShareRepository.Append(mesaFileShareMetrologySi, "MetrologyAttachments", $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}"); | ||||||
|             httpResponseMessage.Wait(); |                 checkDirectory = _FileShareRepository.Append(weekDirectory, $"{item}{headerId}"); | ||||||
|             if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) |                 directory = Path.Combine(_AppSettings.EcMetrologySi, "MetrologyAttachments", $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}", $"{item}{headerId}"); | ||||||
|                 continue; |                 httpResponseMessage = httpClient.GetAsync(checkDirectory); | ||||||
|             json = httpResponseMessage.Result.Content.ReadAsStringAsync(); |                 httpResponseMessage.Wait(); | ||||||
|             json.Wait(); |                 if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) | ||||||
|             nginxFileSystemCollection = JsonSerializer.Deserialize(json.Result, NginxFileSystemCollectionSourceGenerationContext.Default.NginxFileSystemArray); |                     continue; | ||||||
|             if (nginxFileSystemCollection is null) |                 json = httpResponseMessage.Result.Content.ReadAsStringAsync(); | ||||||
|                 continue; |                 json.Wait(); | ||||||
|             foreach (NginxFileSystem nginxFileSystem in nginxFileSystemCollection) |                 nginxFileSystemCollection = JsonSerializer.Deserialize(json.Result, NginxFileSystemCollectionSourceGenerationContext.Default.NginxFileSystemArray); | ||||||
|                 files.Add(_FileShareRepository.Append(checkDirectory, nginxFileSystem.Name).AbsoluteUri); |                 if (nginxFileSystemCollection is null) | ||||||
|  |                     continue; | ||||||
|  |                 foreach (NginxFileSystem nginxFileSystem in nginxFileSystemCollection) | ||||||
|  |                 { | ||||||
|  |                     if (!nginxFileSystem.Name.EndsWith(".pdsf")) | ||||||
|  |                         continue; | ||||||
|  |                     file = Path.Combine(directory, nginxFileSystem.Name); | ||||||
|  |                     files.Add(file); | ||||||
|  |                 } | ||||||
|  |                 if (files.Count != 0) | ||||||
|  |                     break; | ||||||
|  |             } | ||||||
|             if (files.Count != 0) |             if (files.Count != 0) | ||||||
|                 break; |                 break; | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -1,96 +0,0 @@ | |||||||
| @using OI.Metrology.Shared.ViewModels |  | ||||||
| @model OI.Metrology.Shared.ViewModels.Export |  | ||||||
| @{ |  | ||||||
|     ViewData["Title"] = "Export Data"; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| <style> |  | ||||||
|     td { |  | ||||||
|         padding-bottom: 2em; |  | ||||||
|         padding-right: 1em; |  | ||||||
|     } |  | ||||||
| </style> |  | ||||||
|  |  | ||||||
| <h3>Export Data</h3> |  | ||||||
|  |  | ||||||
| <hr /> |  | ||||||
|  |  | ||||||
| <form asp-controller="Export" asp-action="ExportData" method="post" class="form-inline"> |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <label for="ToolType">Tool Type</label> |  | ||||||
|         <div class="form-control" id="ToolType" name="ToolType"></div> |  | ||||||
|         @Html.ValidationMessage("ToolType", new { @class = "text-danger" }) |  | ||||||
|     </div> |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <label for="StartDate">Start Time</label> |  | ||||||
|         <div class="form-control mb-2 mr-sm-2" id="StartDateControl"></div> |  | ||||||
|         <div class="form-control mb-2 mr-sm-2" id="StartTimeControl"></div> |  | ||||||
|         @Html.ValidationMessage("StartDate", new { @class = "text-danger" }) |  | ||||||
|     </div> |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <label for="EndDate">End Time</label> |  | ||||||
|         <div class="form-control mb-2 mr-sm-2" id="EndDateControl"></div> |  | ||||||
|         <div class="form-control mb-2 mr-sm-2" id="EndTimeControl"></div> |  | ||||||
|         @Html.ValidationMessage("EndDate", new { @class = "text-danger" }) |  | ||||||
|     </div> |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <button type="submit" class="btn btn-primary">Export Data</button> |  | ||||||
|     </div> |  | ||||||
|  |  | ||||||
|     <div class="form-group"> |  | ||||||
|         @Html.ValidationMessage("Exception", new { @class = "text-danger" }) |  | ||||||
|     </div> |  | ||||||
|     <div asp-validation-summary="ModelOnly" class="text-danger"></div> |  | ||||||
|  |  | ||||||
| </form> |  | ||||||
|  |  | ||||||
| <script> |  | ||||||
|  |  | ||||||
|     $(document).ready(function () { |  | ||||||
|          |  | ||||||
|         var apiUrl = "@ViewBag.ApiUrl"; |  | ||||||
|          |  | ||||||
|         $("#ToolType").igCombo({ |  | ||||||
|             dataSource: apiUrl + '/tooltypes', |  | ||||||
|             responseDataKey: "Results", |  | ||||||
|             textKey: "ToolTypeName", |  | ||||||
|             valueKey: "ID", |  | ||||||
|             mode: "dropdown", |  | ||||||
|             width: 150 |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         var startTime = new Date("@Model.StartTime.ToString("yyyy-MM-ddTHH:mm")"); |  | ||||||
|  |  | ||||||
|         $("#StartDateControl").igDatePicker({ |  | ||||||
|             dateInputFormat: "date", |  | ||||||
|             value: startTime, |  | ||||||
|             width: 125, |  | ||||||
|             inputName: "StartDate", |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         $("#StartTimeControl").igTimePicker({ |  | ||||||
|             dateInputFormat: "time", |  | ||||||
|             value: startTime, |  | ||||||
|             width: 110, |  | ||||||
|             inputName: "StartTime", |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         var endTime = new Date("@Model.EndTime.ToString("yyyy-MM-ddTHH:mm")"); |  | ||||||
|  |  | ||||||
|         $("#EndDateControl").igDatePicker({ |  | ||||||
|             dateInputFormat: "date", |  | ||||||
|             value: endTime, |  | ||||||
|             width: 125, |  | ||||||
|             inputName: "EndDate", |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         $("#EndTimeControl").igTimePicker({ |  | ||||||
|             dateInputFormat: "time", |  | ||||||
|             value: endTime, |  | ||||||
|             width: 110, |  | ||||||
|             inputName: "EndTime", |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
| </script> |  | ||||||
| @ -1,28 +0,0 @@ | |||||||
| @{ |  | ||||||
|     ViewData["Title"] = "Awaiting Disposition"; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| <h4>Awaiting Disposition</h4> |  | ||||||
|  |  | ||||||
| <div style="height: 450px;"> |  | ||||||
|     <table id="grid"></table> |  | ||||||
| </div> |  | ||||||
|  |  | ||||||
| <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> |  | ||||||
|     <div class="col-xs-1"> |  | ||||||
|         <input type="button" id="OpenButton" value="Open" /> |  | ||||||
|     </div> |  | ||||||
|     <div class="col-xs-1"> |  | ||||||
|         <input type="button" id="RefreshButton" value="Refresh" /> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
|  |  | ||||||
| <script> |  | ||||||
|  |  | ||||||
|     $(document).ready(function () { |  | ||||||
|  |  | ||||||
|         initAwaitingDisposition("@ViewBag.ApiUrl"); |  | ||||||
|  |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
| </script> |  | ||||||
| @ -1,3 +0,0 @@ | |||||||
| @{ |  | ||||||
|     ViewData["Title"] = "Metrology Home Page"; |  | ||||||
| } |  | ||||||
| @ -1,57 +0,0 @@ | |||||||
| @{ |  | ||||||
|     ViewData["Title"] = "Run Headers"; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| <style> |  | ||||||
|     html, |  | ||||||
|     body { |  | ||||||
|         height: 100%; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     div.container-fluid { |  | ||||||
|         height: 90%; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     #HeaderGrid, |  | ||||||
|     #FieldsGrid { |  | ||||||
|         font-size: 12px; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     .FieldTitle { |  | ||||||
|         font-weight: bold; |  | ||||||
|     } |  | ||||||
| </style> |  | ||||||
|  |  | ||||||
| <h4>Run Headers</h4> |  | ||||||
|  |  | ||||||
| <table> |  | ||||||
|     <tr> |  | ||||||
|         <td> |  | ||||||
|             <label for="ToolType">Tool Type:</label> |  | ||||||
|         </td> |  | ||||||
|         <td> |  | ||||||
|             <div id="ToolType"></div> |  | ||||||
|         </td> |  | ||||||
|     </tr> |  | ||||||
| </table> |  | ||||||
|  |  | ||||||
| <table width="100%" height="80%"> |  | ||||||
|     <tr> |  | ||||||
|         <td width="50%"> |  | ||||||
|             <table id="HeaderGrid"></table> |  | ||||||
|         </td> |  | ||||||
|         <td width="50%"> |  | ||||||
|             <table id="FieldsGrid"></table> |  | ||||||
|         </td> |  | ||||||
|     </tr> |  | ||||||
| </table> |  | ||||||
|  |  | ||||||
| <script> |  | ||||||
|  |  | ||||||
|     $(document).ready(function () { |  | ||||||
|  |  | ||||||
|         initRunHeaders("@ViewBag.ApiUrl"); |  | ||||||
|  |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
| </script> |  | ||||||
| @ -1,104 +0,0 @@ | |||||||
| @model OI.Metrology.Shared.ViewModels.RunInfo |  | ||||||
| @{ |  | ||||||
|     ViewData["Title"] = "Run Information"; |  | ||||||
| } |  | ||||||
| <style> |  | ||||||
|     #HeaderGridDiv, |  | ||||||
|     #DetailsGridDiv { |  | ||||||
|         font-size: 12px; |  | ||||||
|     } |  | ||||||
| </style> |  | ||||||
|  |  | ||||||
| <h4>Run Information</h4> |  | ||||||
|  |  | ||||||
| <form class="form-inline mb-4"> |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <label for="ToolType">Tool Type</label> |  | ||||||
|         <div class="form-control" id="ToolType"></div> |  | ||||||
|     </div> |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <label for="StartDate">Start Time</label> |  | ||||||
|         <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> |  | ||||||
|         <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> |  | ||||||
|     </div> |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <label for="EndDate">End Time</label> |  | ||||||
|         <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> |  | ||||||
|         <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> |  | ||||||
|     </div>   |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> |  | ||||||
|     </div>   |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <label class="form-check-label" for="chkAutoRefresh"> |  | ||||||
|             Auto-Refresh |  | ||||||
|         </label> |  | ||||||
|         <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> |  | ||||||
|     </div> |  | ||||||
|     <div class="form-group"> |  | ||||||
|         <label class="form-check-label" for="chkCopyOnGet"> |  | ||||||
|             Copy-On-Get |  | ||||||
|         </label> |  | ||||||
|         <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> |  | ||||||
|     </div> |  | ||||||
| </form> |  | ||||||
|  |  | ||||||
| <div style="height: 300px;" id="HeaderGridDiv"> |  | ||||||
|     <span id="ToolTypeID" hidden></span> |  | ||||||
|     <table id="HeaderGrid"></table> |  | ||||||
| </div> |  | ||||||
|  |  | ||||||
| <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> |  | ||||||
|     <div class="col-xs-1"> |  | ||||||
|         <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> |  | ||||||
|     </div> |  | ||||||
|     <div class="col-xs-1"> |  | ||||||
|         <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> |  | ||||||
|     </div> |  | ||||||
|     <div class="col-xs-1"> |  | ||||||
|         <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> |  | ||||||
|     </div> |  | ||||||
|     <div class="col-xs-1"> |  | ||||||
|         <input type="button" class="btn" id="ViewButton" value="View" disabled /> |  | ||||||
|     </div> |  | ||||||
|     <div class="col-xs-1"> |  | ||||||
|         <input type="button" class="btn" id="PinButton" value="Pin" disabled /> |  | ||||||
|     </div> |  | ||||||
| </div> |  | ||||||
|  |  | ||||||
| <div id="DetailsDiv" hidden> |  | ||||||
|  |  | ||||||
|     <span id="HeaderId" hidden></span> |  | ||||||
|     <span id="HeaderAttachmentId" hidden></span> |  | ||||||
|     <div style="padding-bottom: 20px;" id="DetailsGridDiv"> |  | ||||||
|         <table id="DetailsGrid"></table> |  | ||||||
|     </div> |  | ||||||
|  |  | ||||||
|     <div id="ExportDiv" style="margin-top: 10px;" hidden> |  | ||||||
|         <input type="button" value="Send to OpenInsight" id="OIExportButton" /> |  | ||||||
|         <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> |  | ||||||
|     </div> |  | ||||||
|  |  | ||||||
|     <p style="margin-top: 20px;"> |  | ||||||
|         <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" hidden></iframe> |  | ||||||
|         <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> |  | ||||||
|           |  | ||||||
|         <div id="DataAttachmentDiv" hidden> |  | ||||||
|             <canvas id="DataAttachmentCanvas"></canvas> |  | ||||||
|         </div> |  | ||||||
|         <div id="HeaderAttachmentDiv" hidden> |  | ||||||
|             <canvas id="HeaderAttachmentCanvas"></canvas> |  | ||||||
|         </div> |  | ||||||
|     </p> |  | ||||||
|  |  | ||||||
| </div> |  | ||||||
|  |  | ||||||
| <script> |  | ||||||
|  |  | ||||||
|     $(document).ready(function () { |  | ||||||
|  |  | ||||||
|         initRunInfo("@ViewBag.ApiUrl", "@Model.ToolTypeID", "@Model.HeaderID", "@Model.HeaderAttachmentID"); |  | ||||||
|  |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
| </script> |  | ||||||
| @ -103,6 +103,6 @@ | |||||||
|         $("#runDataSheet5").click(function () { runDataSheet(5, $(this).val()) }); |         $("#runDataSheet5").click(function () { runDataSheet(5, $(this).val()) }); | ||||||
|         $("#runDataSheet6").click(function () { runDataSheet(6, $(this).val()) }); |         $("#runDataSheet6").click(function () { runDataSheet(6, $(this).val()) }); | ||||||
|         $("#restartButton").click(function () { restartButton() }); |         $("#restartButton").click(function () { restartButton() }); | ||||||
|         initWorkMaterial("@ViewBag.ApiUrl"); |         initWorkMaterial("@ViewBag.ApiUrl", ""); | ||||||
|     }); |     }); | ||||||
| </script> | </script> | ||||||
|  | |||||||
| @ -6,36 +6,42 @@ | |||||||
|     <meta name="viewport" content="width=device-width" /> |     <meta name="viewport" content="width=device-width" /> | ||||||
|     <title>@ViewBag.Title</title> |     <title>@ViewBag.Title</title> | ||||||
|  |  | ||||||
|     <script src="~/js/modernizr-3.6.0-custom.js" type="text/javascript" asp-append-version="true"></script> |     <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |  | ||||||
|     <link href="~/styles/bootstrap.min.css" rel="stylesheet" asp-append-version="true" /> |     <link href="https://oi-metrology-viewer-prod.mes.infineon.com/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" | ||||||
|     <link href="~/igniteui/css/themes/bootstrap3/default/infragistics.theme.css" rel="stylesheet" |         rel="stylesheet" /> | ||||||
|         asp-append-version="true" /> |     <link | ||||||
|     <link href="~/igniteui/css/structure/infragistics.css" rel="stylesheet" asp-append-version="true" /> |         href="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|     <link href="~/styles/site.css" rel="stylesheet" asp-append-version="true" /> |         rel="stylesheet" /> | ||||||
|  |     <link | ||||||
|  |         href="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="https://oi-metrology-viewer-prod.mes.infineon.com/styles/site-server.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="https://oi-metrology-viewer-prod.mes.infineon.com/styles/index.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |  | ||||||
|     <script src="~/js/jquery-3.6.0.min.js" type="text/javascript" asp-append-version="true"></script> |     <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" | ||||||
|     <script src="~/js/jquery-ui.min.js" type="text/javascript" asp-append-version="true"></script> |         type="text/javascript"></script> | ||||||
|     <script src="~/igniteui/js/infragistics.core.js" type="text/javascript" asp-append-version="true"></script> |     <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" | ||||||
|     <script src="~/igniteui/js/infragistics.lob.js" type="text/javascript" asp-append-version="true"></script> |         type="text/javascript"></script> | ||||||
|     <script src="~/igniteui/js/infragistics.dv.js" type="text/javascript" asp-append-version="true"></script> |     <script | ||||||
|  |         src="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |     <script | ||||||
|  |         src="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |     <script | ||||||
|  |         src="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |  | ||||||
|     <script src="~/js/chart-4.3.0.min.js" type="module"></script> |     <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|     <script src="~/js/common.js" type="text/javascript" asp-append-version="true"></script> |     <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/common.js?no-cache=2024-06-18-10-54" | ||||||
|     <script src="~/js/site.js" type="text/javascript" asp-append-version="true"></script> |         type="text/javascript"></script> | ||||||
|     <script> |     <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/site-server.js?no-cache=2024-06-18-10-54" | ||||||
|         $(document).ready(function () { |         type="text/javascript"></script> | ||||||
|             if (location.pathname == "/") { |  | ||||||
|                 route = "/AwaitingDispo"; |  | ||||||
|             } |  | ||||||
|             else { |  | ||||||
|                 route = location.pathname; |  | ||||||
|             } |  | ||||||
|             $('ul.nav.navbar-nav').find('a[href="' + route + '"]') |  | ||||||
|                 .closest('li').addClass('alert-info'); |  | ||||||
|         }); |  | ||||||
|     </script> |  | ||||||
| </head> | </head> | ||||||
|  |  | ||||||
| <body> | <body> | ||||||
| @ -57,7 +63,9 @@ | |||||||
|                     <span class="icon-bar"></span> |                     <span class="icon-bar"></span> | ||||||
|                 </button> |                 </button> | ||||||
|                 <div class="navbar-brand"> |                 <div class="navbar-brand"> | ||||||
|                     <a href="/"><img src="~/images/IFX_LOGO_RGB.png" height="20" /></a> |                     <a href="https://oi-metrology-viewer-prod.mes.infineon.com"><img | ||||||
|  |                             src="https://oi-metrology-viewer-prod.mes.infineon.com/images/IFX_LOGO_RGB.png" | ||||||
|  |                             height="20" /></a> | ||||||
|                     OI Metrology Viewer |                     OI Metrology Viewer | ||||||
|                 </div> |                 </div> | ||||||
|             </div> |             </div> | ||||||
| @ -91,8 +99,10 @@ | |||||||
|  |  | ||||||
|     <div id="MessageModal"></div> |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|     <script src="~/js/bootstrap.min.js" type="text/javascript" asp-append-version="true"></script> |     <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/bootstrap.min.js?no-cache=2024-06-18-10-54" | ||||||
|     <script src="~/js/respond.min.js" type="text/javascript" asp-append-version="true"></script> |         type="text/javascript"></script> | ||||||
|  |     <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/respond.min.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|     @RenderSection("scripts", required: false) |     @RenderSection("scripts", required: false) | ||||||
| </body> | </body> | ||||||
|  |  | ||||||
|  | |||||||
							
								
								
									
										198
									
								
								Server/server-pipeline.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,198 @@ | |||||||
|  | trigger: | ||||||
|  |   branches: | ||||||
|  |     include: | ||||||
|  |       - master | ||||||
|  |   paths: | ||||||
|  |     include: | ||||||
|  |       - Server | ||||||
|  |  | ||||||
|  | variables: | ||||||
|  |   runtime: 'win-x64' | ||||||
|  |   coreVersion: 'net8.0' | ||||||
|  |   nugetSource: 'https://artifactory.intra.infineon.com/artifactory/api/nuget/ngt-fi-package-main-vir/' | ||||||
|  |  | ||||||
|  | stages: | ||||||
|  |   - stage: Development | ||||||
|  |     displayName: Development | ||||||
|  |     pool: | ||||||
|  |       name: 'OpenInsight Metrology Viewer' | ||||||
|  |       demands: OpenInsight-Metrology-Viewer-Server-Development | ||||||
|  |     variables: | ||||||
|  |       ASPNETCORE_ENVIRONMENT: 'Development' | ||||||
|  |       assemblyTitle: 'OI.Metrology.Server' | ||||||
|  |       configuration: 'Debug' | ||||||
|  |       userSecretsId: 'b0a3891c-b775-422c-80ee-63a2f385045d' | ||||||
|  |     jobs: | ||||||
|  |       - job: DebugDotnet | ||||||
|  |         steps: | ||||||
|  |           - script: | | ||||||
|  |               echo Assembly Title: $(AssemblyTitle) | ||||||
|  |               echo Build Id: $(Build.BuildId) | ||||||
|  |               echo Build Reason: $(Build.Reason) | ||||||
|  |               echo Repo Id: $(Build.Repository.Id) | ||||||
|  |               echo Repo Name: $(Build.Repository.Name) | ||||||
|  |               echo Source Version: $(Build.SourceVersion) | ||||||
|  |               echo Configuration: $(Configuration) | ||||||
|  |               echo Core Version: $(CoreVersion) | ||||||
|  |               echo Nuget Source: $(NugetSource) | ||||||
|  |               echo Runtime: $(Runtime) | ||||||
|  |               echo UserSecretsId: $(UserSecretsId) | ||||||
|  |             displayName: 'Echo Check' | ||||||
|  |  | ||||||
|  |           - script: | | ||||||
|  |               dotnet user-secrets init | ||||||
|  |               dotnet user-secrets set BuildNumber $(Build.BuildId) | ||||||
|  |               dotnet user-secrets set GitCommit $(Build.SourceVersion) | ||||||
|  |               dotnet user-secrets list | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'App - Safe storage of app secrets' | ||||||
|  |  | ||||||
|  |           - script: dotnet build --configuration $(Configuration) --source $(NugetSource) | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'App - Build' | ||||||
|  |  | ||||||
|  |           - script: dotnet build --configuration $(Configuration) --source $(NugetSource) | ||||||
|  |             workingDirectory: Tests | ||||||
|  |             displayName: 'Tests - Build' | ||||||
|  |  | ||||||
|  |           - script: dotnet test --configuration $(Configuration) | ||||||
|  |             workingDirectory: Tests | ||||||
|  |             displayName: 'Tests - Test' | ||||||
|  |  | ||||||
|  |           - script: dotnet publish --configuration $(Configuration) --runtime $(Runtime) --self-contained | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'App - Publish' | ||||||
|  |  | ||||||
|  |           - script: dotnet publish --configuration $(Configuration) --runtime $(Runtime) -p:PublishAot=true | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'App - AOT Publish' | ||||||
|  |             enabled: false | ||||||
|  |  | ||||||
|  |           - task: CopyFiles@2 | ||||||
|  |             displayName: 'Copy Files to: D:\' | ||||||
|  |             inputs: | ||||||
|  |               Contents: '*' | ||||||
|  |               SourceFolder: 'Server\bin\$(Configuration)\$(CoreVersion)\$(Runtime)\publish' | ||||||
|  |               TargetFolder: 'D:\$(CoreVersion)\$(Runtime)\$(Build.Repository.Name)\$(Configuration)\$(Build.BuildId)\$(AssemblyTitle)' | ||||||
|  |               OverWrite: true | ||||||
|  |  | ||||||
|  |           - script: dotnet clean --configuration $(Configuration) | ||||||
|  |             workingDirectory: Tests | ||||||
|  |             displayName: 'Tests - Clean' | ||||||
|  |  | ||||||
|  |           - script: dotnet clean --configuration $(Configuration) | ||||||
|  |             workingDirectory: Server | ||||||
|  |  | ||||||
|  |           - script: C:/Windows/system32/inetsrv/appcmd.exe stop apppool /apppool.name:$(AssemblyTitle).$(Configuration) | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'Stop Pool' | ||||||
|  |             continueOnError: true | ||||||
|  |  | ||||||
|  |           - script: C:/Windows/system32/inetsrv/appcmd.exe stop site /site.name:$(AssemblyTitle).$(Configuration) | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'Stop Website' | ||||||
|  |             continueOnError: true | ||||||
|  |  | ||||||
|  |           - script: rmdir "D:\web-sites\$(AssemblyTitle).$(Configuration)" | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'Remove MKLink' | ||||||
|  |             continueOnError: true | ||||||
|  |  | ||||||
|  |           - script: mklink /J "D:\web-sites\$(AssemblyTitle).$(Configuration)" "D:\$(CoreVersion)\$(Runtime)\$(Build.Repository.Name)\$(Configuration)\$(Build.BuildId)\$(AssemblyTitle)" | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'Create MKLink' | ||||||
|  |  | ||||||
|  |           - script: mkdir "D:\web-sites\$(AssemblyTitle).$(Configuration)\$(AssemblyTitle).$(Configuration)" | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'Make Directory' | ||||||
|  |             continueOnError: true | ||||||
|  |  | ||||||
|  |           - script: (robocopy /E /IS /IT /IM "%USERPROFILE%/AppData/Roaming/Microsoft/UserSecrets/$(UserSecretsId)" "D:\$(CoreVersion)\$(Runtime)\$(Build.Repository.Name)\$(Configuration)\$(Build.BuildId)\$(AssemblyTitle)" secrets.json) ^& IF %ERRORLEVEL% LEQ 7 exit 0 | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'Replace User Secrets Id File' | ||||||
|  |  | ||||||
|  |           - script: (robocopy /E /IS /IT /IM "%USERPROFILE%/AppData/Roaming/Microsoft/UserSecrets/$(UserSecretsId)" "D:\$(CoreVersion)\$(Runtime)\$(Build.Repository.Name)\$(Configuration)\$(Build.BuildId)\$(AssemblyTitle)" web.config) ^& IF %ERRORLEVEL% LEQ 7 exit 0 | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'Replace Web Configuration File' | ||||||
|  |  | ||||||
|  |           - script: C:/Windows/system32/inetsrv/appcmd.exe start apppool /apppool.name:$(AssemblyTitle).$(Configuration) | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'Start Pool' | ||||||
|  |  | ||||||
|  |           - script: C:/Windows/system32/inetsrv/appcmd.exe start site /site.name:$(AssemblyTitle).$(Configuration) | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'Start Website' | ||||||
|  |  | ||||||
|  |   - stage: Release | ||||||
|  |     displayName: Release | ||||||
|  |     pool: | ||||||
|  |       name: 'OpenInsight Metrology Viewer' | ||||||
|  |       demands: OpenInsight-Metrology-Viewer-Server | ||||||
|  |     variables: | ||||||
|  |       ASPNETCORE_ENVIRONMENT: 'Production' | ||||||
|  |       assemblyTitle: 'OI.Metrology.Server' | ||||||
|  |       configuration: 'Release' | ||||||
|  |     jobs: | ||||||
|  |       - job: ReleaseDotnet | ||||||
|  |         steps: | ||||||
|  |           - script: | | ||||||
|  |               echo Assembly Title: $(AssemblyTitle) | ||||||
|  |               echo Build Id: $(Build.BuildId) | ||||||
|  |               echo Build Reason: $(Build.Reason) | ||||||
|  |               echo Repo Id: $(Build.Repository.Id) | ||||||
|  |               echo Repo Name: $(Build.Repository.Name) | ||||||
|  |               echo Source Version: $(Build.SourceVersion) | ||||||
|  |               echo Configuration: $(Configuration) | ||||||
|  |               echo Core Version: $(CoreVersion) | ||||||
|  |               echo Nuget Source: $(NugetSource) | ||||||
|  |               echo Runtime: $(Runtime) | ||||||
|  |             displayName: 'Echo Check' | ||||||
|  |  | ||||||
|  |           - script: | | ||||||
|  |               dotnet user-secrets init | ||||||
|  |               dotnet user-secrets set BuildNumber $(Build.BuildId) | ||||||
|  |               dotnet user-secrets set GitCommit $(Build.SourceVersion) | ||||||
|  |               dotnet user-secrets list | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'App - Safe storage of app secrets' | ||||||
|  |  | ||||||
|  |           - script: dotnet build --configuration $(Configuration) --source $(NugetSource) | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'App - Build' | ||||||
|  |  | ||||||
|  |           - script: dotnet build --configuration $(Configuration) --source $(NugetSource) | ||||||
|  |             workingDirectory: Tests | ||||||
|  |             displayName: 'Tests - Build' | ||||||
|  |  | ||||||
|  |           - script: dotnet test --configuration $(Configuration) | ||||||
|  |             workingDirectory: Tests | ||||||
|  |             displayName: 'Tests - Test' | ||||||
|  |  | ||||||
|  |           - script: dotnet publish --configuration $(Configuration) --runtime $(Runtime) --self-contained | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'App - Publish' | ||||||
|  |  | ||||||
|  |           - script: dotnet publish --configuration $(Configuration) --runtime $(Runtime) -p:PublishAot=true | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'App - AOT Publish' | ||||||
|  |             enabled: false | ||||||
|  |  | ||||||
|  |           - task: CopyFiles@2 | ||||||
|  |             displayName: 'Copy Files to: D:\' | ||||||
|  |             inputs: | ||||||
|  |               Contents: '*' | ||||||
|  |               SourceFolder: 'Server\bin\$(Configuration)\$(CoreVersion)\$(Runtime)\publish' | ||||||
|  |               TargetFolder: 'D:\$(CoreVersion)\$(Runtime)\$(Build.Repository.Name)\$(Configuration)\$(Build.BuildId)\$(AssemblyTitle)' | ||||||
|  |               OverWrite: true | ||||||
|  |  | ||||||
|  |           - script: dotnet clean --configuration $(Configuration) | ||||||
|  |             workingDirectory: Tests | ||||||
|  |             displayName: 'Tests - Clean' | ||||||
|  |  | ||||||
|  |           - script: dotnet clean --configuration $(Configuration) | ||||||
|  |             workingDirectory: Server | ||||||
|  |             displayName: 'App - Clean' | ||||||
|  |  | ||||||
|  |           - script: 'echo $(Build.SourceVersion)-$(Build.BuildId)>bin_x_x_\$(Configuration)\$(CoreVersion)\win-x64\$(Build.Repository.Name).txt' | ||||||
|  |             displayName: 'Force Fail' | ||||||
|  |             enabled: false | ||||||
							
								
								
									
										183
									
								
								Server/wwwroot/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,183 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="https://metrology-viewer-prod.mes.infineon.com/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="https://metrology-viewer-prod.mes.infineon.com/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link | ||||||
|  |         href="https://metrology-viewer-prod.mes.infineon.com/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link | ||||||
|  |         href="https://metrology-viewer-prod.mes.infineon.com/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="https://metrology-viewer-prod.mes.infineon.com/styles/site-server.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="https://metrology-viewer-prod.mes.infineon.com/styles/index.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="https://metrology-viewer-prod.mes.infineon.com/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |     <script src="https://metrology-viewer-prod.mes.infineon.com/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |     <script | ||||||
|  |         src="https://metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |     <script | ||||||
|  |         src="https://metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |     <script | ||||||
|  |         src="https://metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="https://metrology-viewer-prod.mes.infineon.com/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="https://metrology-viewer-prod.mes.infineon.com/js/common.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |     <script src="https://metrology-viewer-prod.mes.infineon.com/js/site-server.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="https://metrology-viewer-prod.mes.infineon.com"><img | ||||||
|  |                             src="https://metrology-viewer-prod.mes.infineon.com/images/IFX_LOGO_RGB.png" | ||||||
|  |                             height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="https://metrology-viewer-prod.mes.infineon.com/awaiting-disposition.html">Awaiting | ||||||
|  |                             Disposition</a></li> | ||||||
|  |                     <li><a href="https://metrology-viewer-prod.mes.infineon.com/index.html" class="alert-info">Run | ||||||
|  |                             Information</a></li> | ||||||
|  |                     <li><a href="https://metrology-viewer-prod.mes.infineon.com/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-prod.mes.infineon.com/Export" target="_blank">Export</a> | ||||||
|  |                     </li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="https://metrology-viewer-prod.mes.infineon.com/js/bootstrap.min.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |     <script src="https://metrology-viewer-prod.mes.infineon.com/js/respond.min.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  |     <script src="https://metrology-viewer-prod.mes.infineon.com/js/index.js?no-cache=2024-06-18-10-54" | ||||||
|  |         type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
| @ -3,6 +3,13 @@ namespace OI.Metrology.Shared.DataModels; | |||||||
| public record WaferCounter(DateTime DateTime, | public record WaferCounter(DateTime DateTime, | ||||||
|                            string DateTimeFormatted, |                            string DateTimeFormatted, | ||||||
|                            string EquipmentId, |                            string EquipmentId, | ||||||
|  |                            string Message, | ||||||
|                            string Text, |                            string Text, | ||||||
|                            int Total, |                            int Total, | ||||||
|                            string SlotMap); |                            string SlotMap) | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     public static WaferCounter GetWaferCounter(string message) => | ||||||
|  |         new(DateTime.MinValue, string.Empty, string.Empty, message, string.Empty, 0, string.Empty); | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								Shared/DataModels/WaferCounterArchive.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,36 @@ | |||||||
|  | using System.Text.Json.Serialization; | ||||||
|  |  | ||||||
|  | namespace OI.Metrology.Shared.DataModels; | ||||||
|  |  | ||||||
|  | public class WaferCounterArchive | ||||||
|  | { | ||||||
|  |  | ||||||
|  |     public long ID { get; set; } | ||||||
|  |     public DateTime InsertDate { get; set; } | ||||||
|  |     public Guid AttachmentID { get; set; } | ||||||
|  |     public string? Title { get; set; } | ||||||
|  |     public DateTime Date { get; set; } | ||||||
|  |     public long ToolTypeID { get; set; } | ||||||
|  |     public string? ToolTypeName { get; set; } | ||||||
|  |  | ||||||
|  |     public string? MesEntity { get; set; } | ||||||
|  |  | ||||||
|  |     public string? Employee { get; set; } | ||||||
|  |     public string? Layer { get; set; } | ||||||
|  |     public string? PSN { get; set; } | ||||||
|  |     public string? RDS { get; set; } | ||||||
|  |     public string? Reactor { get; set; } | ||||||
|  |     public string? Recipe { get; set; } | ||||||
|  |     public string? Zone { get; set; } | ||||||
|  |  | ||||||
|  |     public string? SlotMap { get; set; } | ||||||
|  |     public string? Text { get; set; } | ||||||
|  |     public int? Total { get; set; } | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
|  | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
|  | [JsonSerializable(typeof(WaferCounterArchive))] | ||||||
|  | public partial class WaferCounterArchiveSourceGenerationContext : JsonSerializerContext | ||||||
|  | { | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								Shared/Models/Attachment.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,17 @@ | |||||||
|  | using System.Text.Json.Serialization; | ||||||
|  |  | ||||||
|  | namespace OI.Metrology.Shared.Models; | ||||||
|  |  | ||||||
|  | public record Attachment(string? SubGroupId, | ||||||
|  |                          long? HeaderId, | ||||||
|  |                          string? HeaderIdDirectory, | ||||||
|  |                          string? UniqueId, | ||||||
|  |                          string? DestinationFileName, | ||||||
|  |                          string? SourceFileName, | ||||||
|  |                          string? AttachmentId); | ||||||
|  |  | ||||||
|  | [JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)] | ||||||
|  | [JsonSerializable(typeof(Attachment))] | ||||||
|  | public partial class AttachmentSourceGenerationContext : JsonSerializerContext | ||||||
|  | { | ||||||
|  | } | ||||||
							
								
								
									
										5
									
								
								Shared/Models/CharacterizationInfo.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,5 @@ | |||||||
|  | namespace OI.Metrology.Shared.Models; | ||||||
|  |  | ||||||
|  | public record CharacterizationInfo(string? Lot, | ||||||
|  |                                    DateTime LastWriteTime, | ||||||
|  |                                    string[] Lines); | ||||||
							
								
								
									
										16
									
								
								Shared/Models/CharacterizationParameters.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,16 @@ | |||||||
|  | using System.Text.Json.Serialization; | ||||||
|  |  | ||||||
|  | namespace OI.Metrology.Shared.Models; | ||||||
|  |  | ||||||
|  | public record CharacterizationParameters([property: JsonPropertyName("area")] string? Area, | ||||||
|  |                                          [property: JsonPropertyName("equipment-id")] string? EquipmentId, | ||||||
|  |                                          [property: JsonPropertyName("search-pattern")] string? SearchPattern, | ||||||
|  |                                          [property: JsonPropertyName("start-time")] string? StartTime, | ||||||
|  |                                          [property: JsonPropertyName("end-time")] string? EndTime, | ||||||
|  |                                          [property: JsonPropertyName("wafer-size")] string? WaferSize); | ||||||
|  |  | ||||||
|  | [JsonSourceGenerationOptions(WriteIndented = true)] | ||||||
|  | [JsonSerializable(typeof(CharacterizationParameters))] | ||||||
|  | public partial class CharacterizationParametersSourceGenerationContext : JsonSerializerContext | ||||||
|  | { | ||||||
|  | } | ||||||
| @ -8,7 +8,7 @@ public record Cleans( | |||||||
| // [property: JsonPropertyName("cleanTools")] object[] cleanTools | // [property: JsonPropertyName("cleanTools")] object[] cleanTools | ||||||
| ); | ); | ||||||
|  |  | ||||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
| [JsonSerializable(typeof(Cleans))] | [JsonSerializable(typeof(Cleans))] | ||||||
| public partial class CleansSourceGenerationContext : JsonSerializerContext | public partial class CleansSourceGenerationContext : JsonSerializerContext | ||||||
| { | { | ||||||
|  | |||||||
| @ -11,7 +11,7 @@ public record Inspection( | |||||||
| // [property: JsonPropertyName("backSide")] BackSide BackSide | // [property: JsonPropertyName("backSide")] BackSide BackSide | ||||||
| ); | ); | ||||||
|  |  | ||||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
| [JsonSerializable(typeof(Inspection))] | [JsonSerializable(typeof(Inspection))] | ||||||
| public partial class InspectionSourceGenerationContext : JsonSerializerContext | public partial class InspectionSourceGenerationContext : JsonSerializerContext | ||||||
| { | { | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								Shared/Models/PollValue.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,17 @@ | |||||||
|  | using System.Text.Json.Serialization; | ||||||
|  |  | ||||||
|  | namespace OI.Metrology.Shared.Models; | ||||||
|  |  | ||||||
|  | public record PollValue(string? Json, | ||||||
|  |                         [property: JsonPropertyName("id")] int? Id, | ||||||
|  |                         [property: JsonPropertyName("page")] string? Page, | ||||||
|  |                         string? QueryString, | ||||||
|  |                         string? RemoteIpAddress, | ||||||
|  |                         [property: JsonPropertyName("time")] long? Time, | ||||||
|  |                         [property: JsonPropertyName("value")] int? Value); | ||||||
|  |  | ||||||
|  | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
|  | [JsonSerializable(typeof(PollValue))] | ||||||
|  | public partial class PollValueSourceGenerationContext : JsonSerializerContext | ||||||
|  | { | ||||||
|  | } | ||||||
| @ -19,7 +19,7 @@ public record ProdSpec( | |||||||
|     [property: JsonPropertyName("prsStages")] PrsStage[] PrsStages |     [property: JsonPropertyName("prsStages")] PrsStage[] PrsStages | ||||||
| ); | ); | ||||||
|  |  | ||||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
| [JsonSerializable(typeof(ProdSpec))] | [JsonSerializable(typeof(ProdSpec))] | ||||||
| public partial class ProdSpecSourceGenerationContext : JsonSerializerContext | public partial class ProdSpecSourceGenerationContext : JsonSerializerContext | ||||||
| { | { | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ public record ProdSpecRoot( | |||||||
| // [property: JsonPropertyName("_class")] string Class | // [property: JsonPropertyName("_class")] string Class | ||||||
| ); | ); | ||||||
|  |  | ||||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
| [JsonSerializable(typeof(ProdSpecRoot))] | [JsonSerializable(typeof(ProdSpecRoot))] | ||||||
| public partial class ProdSpecRootSourceGenerationContext : JsonSerializerContext | public partial class ProdSpecRootSourceGenerationContext : JsonSerializerContext | ||||||
| { | { | ||||||
|  | |||||||
| @ -12,7 +12,7 @@ public record PrsStage( | |||||||
|     [property: JsonPropertyName("qaMetTests")] QaMetTest[] QaMetTests |     [property: JsonPropertyName("qaMetTests")] QaMetTest[] QaMetTests | ||||||
| ); | ); | ||||||
|  |  | ||||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
| [JsonSerializable(typeof(PrsStage))] | [JsonSerializable(typeof(PrsStage))] | ||||||
| public partial class PrsStageSourceGenerationContext : JsonSerializerContext | public partial class PrsStageSourceGenerationContext : JsonSerializerContext | ||||||
| { | { | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ public record QaMetTest( | |||||||
|     [property: JsonPropertyName("sequence")] string Sequence |     [property: JsonPropertyName("sequence")] string Sequence | ||||||
| ); | ); | ||||||
|  |  | ||||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
| [JsonSerializable(typeof(QaMetTest))] | [JsonSerializable(typeof(QaMetTest))] | ||||||
| public partial class QaMetTestSourceGenerationContext : JsonSerializerContext | public partial class QaMetTestSourceGenerationContext : JsonSerializerContext | ||||||
| { | { | ||||||
|  | |||||||
| @ -14,5 +14,6 @@ public interface IAwaitingDispoController<T> | |||||||
|     T Index(); |     T Index(); | ||||||
|     T MarkAsReviewed(long headerid, int tooltypeid); |     T MarkAsReviewed(long headerid, int tooltypeid); | ||||||
|     T MarkAsAwaiting(long headerid, int tooltypeid); |     T MarkAsAwaiting(long headerid, int tooltypeid); | ||||||
|  |     T GetHeaderAttachmentID(int toolTypeId, long headerid); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -1,4 +1,5 @@ | |||||||
| using OI.Metrology.Shared.DataModels; | using OI.Metrology.Shared.DataModels; | ||||||
|  | using System.Data; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Shared.Models.Stateless; | namespace OI.Metrology.Shared.Models.Stateless; | ||||||
|  |  | ||||||
| @ -9,5 +10,7 @@ public interface IExportRepository | |||||||
|     Result<HeaderCommon[]> GetHeaders(HeaderCommon headerCommon); |     Result<HeaderCommon[]> GetHeaders(HeaderCommon headerCommon); | ||||||
|     Result<HeaderCommon[]> GetLogistics(HeaderCommon headerCommon); |     Result<HeaderCommon[]> GetLogistics(HeaderCommon headerCommon); | ||||||
|     string GetProcessDataStandardFormat(HeaderCommon headerCommon); |     string GetProcessDataStandardFormat(HeaderCommon headerCommon); | ||||||
|  |     string GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend); | ||||||
|  |     Result<DataTable> GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -6,7 +6,9 @@ public interface IFileShareController<T> | |||||||
|     enum Action : int |     enum Action : int | ||||||
|     { |     { | ||||||
|         Index = 0, |         Index = 0, | ||||||
|         MarkAsPinned = 1 |         CopyFile = 1, | ||||||
|  |         MoveFile = 2, | ||||||
|  |         FileWrite = 3, | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     static string GetRouteName() => nameof(IFileShareController<T>)[1..^10]; |     static string GetRouteName() => nameof(IFileShareController<T>)[1..^10]; | ||||||
|  | |||||||
| @ -1,3 +1,6 @@ | |||||||
|  | using OI.Metrology.Shared.DataModels; | ||||||
|  | using System.Collections.ObjectModel; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Shared.Models.Stateless; | namespace OI.Metrology.Shared.Models.Stateless; | ||||||
|  |  | ||||||
| public interface IFileShareRepository | public interface IFileShareRepository | ||||||
| @ -7,10 +10,10 @@ public interface IFileShareRepository | |||||||
|     void MoveFile(string from, string to); |     void MoveFile(string from, string to); | ||||||
|     Uri Append(Uri uri, params string[] paths); |     Uri Append(Uri uri, params string[] paths); | ||||||
|     void FileWrite(string path, string contents); |     void FileWrite(string path, string contents); | ||||||
|  |     ReadOnlyCollection<ToolTypeNameId> GetEquipmentIds(); | ||||||
|     HttpResponseMessage ReadFile(HttpClient httpClient, Uri uri); |     HttpResponseMessage ReadFile(HttpClient httpClient, Uri uri); | ||||||
|     void CopyFile(HttpClient httpClient, string from, string to); |     void CopyFile(HttpClient httpClient, string from, string to); | ||||||
|     void MoveFile(HttpClient httpClient, string from, string to); |     void MoveFile(HttpClient httpClient, string from, string to); | ||||||
|     void FileWrite(HttpClient httpClient, string path, string contents); |     ReadOnlyCollection<CharacterizationInfo> GetArchiveData(CharacterizationParameters characterizationParameters); | ||||||
|     List<NginxFileSystemSortable> GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith); |     ReadOnlyCollection<NginxFileSystemSortable> GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -1,3 +1,5 @@ | |||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Shared.Models.Stateless; | namespace OI.Metrology.Shared.Models.Stateless; | ||||||
|  |  | ||||||
| public interface IInboundController<T> | public interface IInboundController<T> | ||||||
| @ -9,7 +11,7 @@ public interface IInboundController<T> | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     static string GetRouteName() => nameof(IInboundController<T>)[1..^10]; |     static string GetRouteName() => nameof(IInboundController<T>)[1..^10]; | ||||||
|     T Post(string tooltype); |     T Post(string tooltype, JsonElement? jsonElement); | ||||||
|     T AttachFile(string tooltype, long headerid, string datauniqueid = ""); |     T AttachFile(string tooltype, Attachment? attachment); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -1,5 +1,6 @@ | |||||||
| using OI.Metrology.Shared.Services; | using OI.Metrology.Shared.Services; | ||||||
| using System.Net; | using System.Net; | ||||||
|  | using System.Text.Json; | ||||||
|  |  | ||||||
| namespace OI.Metrology.Shared.Models.Stateless; | namespace OI.Metrology.Shared.Models.Stateless; | ||||||
|  |  | ||||||
| @ -7,7 +8,7 @@ public interface IInboundRepository | |||||||
| { | { | ||||||
|  |  | ||||||
|     bool IsIPAddressAllowed(string inboundApiAllowedIPList, IPAddress? remoteIP); |     bool IsIPAddressAllowed(string inboundApiAllowedIPList, IPAddress? remoteIP); | ||||||
|     DataResponse Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string tooltype, string? json); |     void AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string toolTypeName, Attachment? attachment); | ||||||
|     string? AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string tooltype, long headerid, string datauniqueid, string fileName, object uploadedFile); |     DataResponse Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string toolTypeName, JsonElement? jsonElement); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -9,12 +9,15 @@ public interface IInfinityQSV4Controller<T> | |||||||
|         MarkAsPinned = 1 |         MarkAsPinned = 1 | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     static string GetRouteName() => nameof(IInfinityQSV4Controller<T>)[1..^10]; |     static string GetRouteName() => nameof(IInfinityQSV4Controller<T>)[1..^12]; | ||||||
|  |     static string GetRouteVersion() => nameof(IInfinityQSV4Controller<T>)[1..^10][^2..]; | ||||||
|  |      | ||||||
|     T GetData(string sub_group_id); |     T GetData(string sub_group_id); | ||||||
|     T GetHeader(string sub_group_id); |     T GetHeader(string sub_group_id); | ||||||
|     T GetDescriptors(string sub_group_id); |     T GetDescriptors(string sub_group_id); | ||||||
|     T GetEpiProTempVerification(int[] night); |     T GetEpiProTempVerification(int[] night); | ||||||
|     T GetEpiProTempVerificationRows(int[] night); |     T GetEpiProTempVerificationRows(int[] night); | ||||||
|  |     T GetLastGroupIdWithValue(string process, string? part, int? test); | ||||||
|     T GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe); |     T GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe); | ||||||
|     T GetCommandText(string sub_group_id, string process, string job, string part, string lot, string date_time); |     T GetCommandText(string sub_group_id, string process, string job, string part, string lot, string date_time); | ||||||
|  |  | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ public interface IInfinityQSV4Repository | |||||||
|     string GetCommandText(List<string> eppReactorNumbers); |     string GetCommandText(List<string> eppReactorNumbers); | ||||||
|     List<string[]> GetEpiProTempVerificationRows(int[] night); |     List<string[]> GetEpiProTempVerificationRows(int[] night); | ||||||
|     Result<InfinityQSDescriptorV4[]> GetDescriptors(string subGroupId); |     Result<InfinityQSDescriptorV4[]> GetDescriptors(string subGroupId); | ||||||
|     Dictionary<string, List<string>> GetEngineeringSpcReview(); |     string GetLastGroupIdWithValue(string process, string? part, int? test); | ||||||
|     string GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe); |     string GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe); | ||||||
|     string GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime); |     string GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime); | ||||||
|  |  | ||||||
|  | |||||||
| @ -8,42 +8,30 @@ namespace OI.Metrology.Shared.Models.Stateless; | |||||||
| public interface IMetrologyRepository | public interface IMetrologyRepository | ||||||
| { | { | ||||||
|  |  | ||||||
|  |     ToolType GetToolTypeByID(int id); | ||||||
|  |     TransactionScope StartTransaction(); | ||||||
|     IEnumerable<ToolType> GetToolTypes(); |     IEnumerable<ToolType> GetToolTypes(); | ||||||
|     ToolType GetToolTypeByName(string name); |     ToolType GetToolTypeByName(string name); | ||||||
|     ToolType GetToolTypeByID(int id); |  | ||||||
|  |  | ||||||
|     IEnumerable<ToolTypeMetadata> GetToolTypeMetadataByToolTypeID(int id); |  | ||||||
|  |  | ||||||
|     TransactionScope StartTransaction(); |  | ||||||
|  |  | ||||||
|     void PurgeExistingData(int toolTypeId, string title); |  | ||||||
|     long InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName); |  | ||||||
|  |  | ||||||
|     DataTable ExportData(string spName, DateTime startTime, DateTime endTime); |  | ||||||
|  |  | ||||||
|     DataTable GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords); |  | ||||||
|     DataTable GetData(int toolTypeId, long headerId); |     DataTable GetData(int toolTypeId, long headerId); | ||||||
|     DataTable GetDataSharePoint(int toolTypeId, string headerId); |     void PurgeExistingData(int toolTypeId, string title); | ||||||
|  |  | ||||||
|     HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords); |  | ||||||
|  |  | ||||||
|     Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title); |  | ||||||
|     Guid GetDataAttachmentIDByTitle(int toolTypeId, string title); |  | ||||||
|  |  | ||||||
|     Guid GetHeaderAttachmentID(int toolTypeId, long headerId); |  | ||||||
|     string GetHeaderInsertDate(int toolTypeId, long headerId); |  | ||||||
|     string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId); |  | ||||||
|     void SetHeaderDirName(string tableName, long headerId, string dateDir); |  | ||||||
|     Guid GetDataAttachmentID(int toolTypeId, long headerId, string title); |  | ||||||
|     string GetDataInsertDate(int toolTypeId, long headerId, string title); |  | ||||||
|  |  | ||||||
|     void SetDataDirName(string tableName, long headerId, string title, string dateDir); |  | ||||||
|     DataSet GetOIExportData(int toolTypeId, long headerid); |     DataSet GetOIExportData(int toolTypeId, long headerid); | ||||||
|  |     Guid GetHeaderAttachmentID(int toolTypeId, long headerId); | ||||||
|     IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid); |  | ||||||
|  |  | ||||||
|     IEnumerable<AwaitingDisposition> GetAwaitingDisposition(); |     IEnumerable<AwaitingDisposition> GetAwaitingDisposition(); | ||||||
|  |     string GetHeaderInsertDate(int toolTypeId, long headerId); | ||||||
|  |     Guid GetDataAttachmentIDByTitle(int toolTypeId, string title); | ||||||
|  |     Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title); | ||||||
|     int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate); |     int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate); | ||||||
|  |     IEnumerable<ToolTypeMetadata> GetToolTypeMetadataByToolTypeID(int id); | ||||||
|  |     string GetDataInsertDate(int toolTypeId, long headerId, string title); | ||||||
|  |     void SetHeaderDirName(string tableName, long headerId, string dateDir); | ||||||
|  |     DataTable ExportData(string spName, DateTime startTime, DateTime endTime); | ||||||
|  |     string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId); | ||||||
|  |     void SetHeaderAttachmentID(int toolTypeId, long headerId, string attachmentId); | ||||||
|  |     void SetDataDirName(string tableName, long headerId, string title, string dateDir); | ||||||
|  |     IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid); | ||||||
|  |     void SetDataAttachmentID(int toolTypeId, long headerId, string title, string attachmentId); | ||||||
|  |     HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords); | ||||||
|  |     long InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName); | ||||||
|  |     DataTable GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords); | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -10,10 +10,8 @@ public interface IToolTypesRepository | |||||||
|     Result<ToolTypeNameId[]> Index(IMetrologyRepository metrologyRepository); |     Result<ToolTypeNameId[]> Index(IMetrologyRepository metrologyRepository); | ||||||
|     Result<DataTable> GetData(IMetrologyRepository metrologyRepository, int id, long headerid); |     Result<DataTable> GetData(IMetrologyRepository metrologyRepository, int id, long headerid); | ||||||
|     Result<ColumnValue[]> GetHeaderFields(IMetrologyRepository metrologyRepository, int id, long headerid); |     Result<ColumnValue[]> GetHeaderFields(IMetrologyRepository metrologyRepository, int id, long headerid); | ||||||
|     byte[] GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend); |  | ||||||
|     Result<HeaderCommon[]> GetHeaderTitles(IMetrologyRepository metrologyRepository, int id, int? page, int? pagesize); |     Result<HeaderCommon[]> GetHeaderTitles(IMetrologyRepository metrologyRepository, int id, int? page, int? pagesize); | ||||||
|     Result<ToolTypeMetadataResult> GetToolTypeMetadata(IMetrologyRepository metrologyRepository, int id, string sortby = ""); |     Result<ToolTypeMetadataResult> GetToolTypeMetadata(IMetrologyRepository metrologyRepository, int id, string sortby = ""); | ||||||
|     Result<DataTable> GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend); |  | ||||||
|     string? OIExport(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, long headerid); |     string? OIExport(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, long headerid); | ||||||
|     Result<DataTable> GetHeaders(IMetrologyRepository metrologyRepository, int id, string? datebegin, string? dateend, int? page, int? pagesize, long? headerid); |     Result<DataTable> GetHeaders(IMetrologyRepository metrologyRepository, int id, string? datebegin, string? dateend, int? page, int? pagesize, long? headerid); | ||||||
|     (string?, string?, Stream?) GetAttachment(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, string tabletype, string attachmentId, string filename); |     (string?, string?, Stream?) GetAttachment(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, string tabletype, string attachmentId, string filename); | ||||||
|  | |||||||
| @ -11,7 +11,6 @@ public interface IWaferCounterController<T> | |||||||
|  |  | ||||||
|     static string GetRouteName() => nameof(IWaferCounterController<T>)[1..^10]; |     static string GetRouteName() => nameof(IWaferCounterController<T>)[1..^10]; | ||||||
|  |  | ||||||
|     T GetLastQuantityAndSlotMap(string area, string waferSize); |     T GetLastQuantityAndSlotMap(string area, string waferSize, string text); | ||||||
|     T GetLastQuantityAndSlotMapWithText(string area, string waferSize, string text); |  | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -4,7 +4,6 @@ public interface IWaferCounterRepository | |||||||
| { | { | ||||||
|  |  | ||||||
|     string? GetSlotMap(string line1, string line2); |     string? GetSlotMap(string line1, string line2); | ||||||
|     DataModels.WaferCounter GetLastQuantityAndSlotMap(string area, string waferSize); |     DataModels.WaferCounter? GetLastQuantityAndSlotMap(string area, string waferSize, string text); | ||||||
|     DataModels.WaferCounter? GetLastQuantityAndSlotMapWithText(string area, string waferSize, string text); |  | ||||||
|  |  | ||||||
| } | } | ||||||
| @ -7,7 +7,7 @@ public record Surfscan( | |||||||
|     [property: JsonPropertyName("surfscanRecipes")] SurfscanRecipe[] SurfscanRecipes |     [property: JsonPropertyName("surfscanRecipes")] SurfscanRecipe[] SurfscanRecipes | ||||||
| ); | ); | ||||||
|  |  | ||||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
| [JsonSerializable(typeof(Surfscan))] | [JsonSerializable(typeof(Surfscan))] | ||||||
| public partial class SurfscanSourceGenerationContext : JsonSerializerContext | public partial class SurfscanSourceGenerationContext : JsonSerializerContext | ||||||
| { | { | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ public record SurfscanRecipe( | |||||||
|     [property: JsonPropertyName("sampleSize")] int? SampleSize |     [property: JsonPropertyName("sampleSize")] int? SampleSize | ||||||
| ); | ); | ||||||
|  |  | ||||||
| [JsonSourceGenerationOptions(WriteIndented = true)] | [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)] | ||||||
| [JsonSerializable(typeof(SurfscanRecipe))] | [JsonSerializable(typeof(SurfscanRecipe))] | ||||||
| public partial class SurfscanRecipeSourceGenerationContext : JsonSerializerContext | public partial class SurfscanRecipeSourceGenerationContext : JsonSerializerContext | ||||||
| { | { | ||||||
|  | |||||||
| @ -29,7 +29,7 @@ | |||||||
|         <DefineConstants>Linux</DefineConstants> |         <DefineConstants>Linux</DefineConstants> | ||||||
|     </PropertyGroup> |     </PropertyGroup> | ||||||
|     <ItemGroup> |     <ItemGroup> | ||||||
|         <PackageReference Include="System.Text.Json" Version="8.0.0" /> |         <PackageReference Include="System.Text.Json" Version="9.0.7" /> | ||||||
|         <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> |         <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> | ||||||
|         <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" /> |         <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" /> | ||||||
|     </ItemGroup> |     </ItemGroup> | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| namespace OI.Metrology.Shared.Services; | namespace OI.Metrology.Shared.Services; | ||||||
|  |  | ||||||
| using DataModels; | using DataModels; | ||||||
|  | using OI.Metrology.Shared.Models; | ||||||
| using OI.Metrology.Shared.Models.Stateless; | using OI.Metrology.Shared.Models.Stateless; | ||||||
|  |  | ||||||
| public interface IAttachmentsService | public interface IAttachmentsService | ||||||
| @ -8,5 +9,5 @@ public interface IAttachmentsService | |||||||
|     Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename); |     Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename); | ||||||
|     Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename); |     Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename); | ||||||
|     string? GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId); |     string? GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId); | ||||||
|     void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, object uploadedFile); |     void SaveAttachment(ToolType toolType, Attachment attachment); | ||||||
| } | } | ||||||
							
								
								
									
										5
									
								
								Static/.vscode/mklink.md
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,5 @@ | |||||||
|  | # mklink | ||||||
|  |  | ||||||
|  | ```bash | ||||||
|  | mklink /J "D:\wwwRoot" "L:\DevOps\Mesa_FI\OI-Metrology\Static" | ||||||
|  | ``` | ||||||
							
								
								
									
										5
									
								
								Static/.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,5 @@ | |||||||
|  | { | ||||||
|  |     "cSpell.words": [ | ||||||
|  |         "Infineon" | ||||||
|  |     ] | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								Static/.vscode/tasks.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,28 @@ | |||||||
|  | { | ||||||
|  |     "version": "2.0.0", | ||||||
|  |     "tasks": [ | ||||||
|  |         { | ||||||
|  |             "type": "shell", | ||||||
|  |             "label": "MakeDirctory", | ||||||
|  |             "command": "mkdir", | ||||||
|  |             "args": [ | ||||||
|  |                 "D:\\web-sites\\OI-Metrology\\pp-6737ddfb-_______-OI-Metrology-Release" | ||||||
|  |             ], | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |             "type": "shell", | ||||||
|  |             "label": "CopySite", | ||||||
|  |             "command": "robocopy", | ||||||
|  |             "args": [ | ||||||
|  |                 "L:\\DevOps\\Mesa_FI\\OI-Metrology\\Static", | ||||||
|  |                 "D:\\web-sites\\OI-Metrology\\pp-6737ddfb-_______-OI-Metrology-Release\\Static", | ||||||
|  |                 "/E", | ||||||
|  |                 "/MT:6", | ||||||
|  |                 "/NFL", | ||||||
|  |                 "/NDL", | ||||||
|  |                 "/NJH", | ||||||
|  |                 "/NJS" | ||||||
|  |             ], | ||||||
|  |         } | ||||||
|  |     ] | ||||||
|  | } | ||||||
							
								
								
									
										161
									
								
								Static/AwaitingDispo/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,161 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html" class="alert-info">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										161
									
								
								Static/Export/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,161 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html" class="alert-info">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										161
									
								
								Static/Metrology/AwaitingDispo/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,161 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html" class="alert-info">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										161
									
								
								Static/Metrology/Export/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,161 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html" class="alert-info">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										161
									
								
								Static/Metrology/RunHeaders/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,161 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html" class="alert-info">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										161
									
								
								Static/Metrology/RunInfo/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,161 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html" class="alert-info">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										161
									
								
								Static/Metrology/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,161 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html" class="alert-info">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										161
									
								
								Static/RunHeaders/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,161 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html" class="alert-info">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										161
									
								
								Static/RunInfo/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,161 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Run Information</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html" class="alert-info">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 300px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ReviewButton" value="Review" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="ViewButton" value="View" disabled /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="PinButton" value="Pin" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |  | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div id="ExportDiv" style="margin-top: 10px;" hidden> | ||||||
|  |                 <input type="button" value="Send to OpenInsight" id="OIExportButton" /> | ||||||
|  |                 <span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span> | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <p style="margin-top: 20px;"> | ||||||
|  |                 <iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" | ||||||
|  |                     hidden></iframe> | ||||||
|  |                 <iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe> | ||||||
|  |                   | ||||||
|  |             <div id="DataAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="DataAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             <div id="HeaderAttachmentDiv" hidden> | ||||||
|  |                 <canvas id="HeaderAttachmentCanvas"></canvas> | ||||||
|  |             </div> | ||||||
|  |             </p> | ||||||
|  |  | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										88
									
								
								Static/awaiting-disposition.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,88 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Awaiting Disposition</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html" class="alert-info">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |         <h4>Awaiting Disposition</h4> | ||||||
|  |  | ||||||
|  |         <div style="height: 450px;"> | ||||||
|  |             <table id="grid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" id="OpenButton" value="Open" /> | ||||||
|  |             </div> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" id="RefreshButton" value="Refresh" /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/awaiting-disposition.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										96
									
								
								Static/export.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,96 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>Export Data</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/export.css?no-cache=2024-06-18-10-54" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html">Files</a></li> | ||||||
|  |                     <li><a href="/export.html" class="alert-info">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |         <h3>Export Data</h3> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |  | ||||||
|  |         <form class="form-inline"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool Type</label> | ||||||
|  |                 <div class="form-control" id="ToolType" name="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <button type="button" id="ExportButton" class="btn btn-primary">Export Data</button> | ||||||
|  |             </div> | ||||||
|  |             <div asp-validation-summary="ModelOnly" class="text-danger"></div> | ||||||
|  |         </form> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/export.js?no-cache=2024-06-18-10-54" type="text/javascript"></script> | ||||||
|  |     <script src="/js/FileSaver.min.js" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
							
								
								
									
										
											BIN
										
									
								
								Static/favicon.ico
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										129
									
								
								Static/files.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @ -0,0 +1,129 @@ | |||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  |  | ||||||
|  | <head> | ||||||
|  |     <meta charset="utf-8" /> | ||||||
|  |     <meta name="viewport" content="width=device-width" /> | ||||||
|  |     <title>File(s)</title> | ||||||
|  |  | ||||||
|  |     <script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <link href="/styles/bootstrap.min.css?no-cache=2024-10-04-08-34" rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-10-04-08-34" | ||||||
|  |         rel="stylesheet" /> | ||||||
|  |     <link href="/igniteui/css/structure/infragistics.css?no-cache=2024-10-04-08-34" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/site-server.css?no-cache=2024-10-04-08-34" rel="stylesheet" /> | ||||||
|  |     <link href="/styles/files.css?no-cache=2024-10-04-08-34" rel="stylesheet" /> | ||||||
|  |  | ||||||
|  |     <script src="/js/jquery-3.6.0.min.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  |     <script src="/js/jquery-ui.min.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.core.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.lob.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  |     <script src="/igniteui/js/infragistics.dv.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/chart-4.3.0.min.js" type="module"></script> | ||||||
|  |  | ||||||
|  |     <script src="/js/common.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  |     <script src="/js/site-server.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  | </head> | ||||||
|  |  | ||||||
|  | <body> | ||||||
|  |     <div class="navbar navbar-fixed-top"> | ||||||
|  |         <div class="container-fluid"> | ||||||
|  |             <div class="navbar-header"> | ||||||
|  |                 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                     <span class="icon-bar"></span> | ||||||
|  |                 </button> | ||||||
|  |                 <div class="navbar-brand"> | ||||||
|  |                     <a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a> | ||||||
|  |                     OI Metrology Viewer | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |             <div class="navbar-collapse collapse"> | ||||||
|  |                 <ul class="nav navbar-nav"> | ||||||
|  |                     <li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li> | ||||||
|  |                     <li><a href="/index.html">Run Information</a></li> | ||||||
|  |                     <li><a href="/run-headers.html">Run Headers</a></li> | ||||||
|  |                     <li><a href="/files.html" class="alert-info">Files</a></li> | ||||||
|  |                     <li><a href="/export.html">Export</a></li> | ||||||
|  |                     <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> | ||||||
|  |                     <li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li> | ||||||
|  |                     <li><a href="/mes.html" target="_blank">FI Backlog</a></li> | ||||||
|  |                 </ul> | ||||||
|  |                 <p class="navbar-text navbar-right"> | ||||||
|  |                       | ||||||
|  |                 </p> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |     </div> | ||||||
|  |     <div class="container-fluid body-content"> | ||||||
|  |  | ||||||
|  |         <h4>Run Information</h4> | ||||||
|  |  | ||||||
|  |         <form class="form-inline mb-4"> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="ToolType">Tool</label> | ||||||
|  |                 <div class="form-control" id="ToolType"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="StartDate">Start Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="StartTime"></div> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label for="EndDate">End Time</label> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndDate"></div> | ||||||
|  |                 <div class="form-control mb-2 mr-sm-2" id="EndTime"></div> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" /> | ||||||
|  |             </div>   | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkAutoRefresh"> | ||||||
|  |                     Auto-Refresh | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkAutoRefresh"> | ||||||
|  |             </div> | ||||||
|  |             <div class="form-group"> | ||||||
|  |                 <label class="form-check-label" for="chkCopyOnGet"> | ||||||
|  |                     Copy-On-Get | ||||||
|  |                 </label> | ||||||
|  |                 <input class="form-check-input" type="checkbox" id="chkCopyOnGet"> | ||||||
|  |             </div> | ||||||
|  |         </form> | ||||||
|  |  | ||||||
|  |         <div style="height: 500px;" id="HeaderGridDiv"> | ||||||
|  |             <span id="ToolTypeID" hidden></span> | ||||||
|  |             <table id="HeaderGrid"></table> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div class="row" style="margin-top: 10px; margin-bottom: 20px;"> | ||||||
|  |             <div class="col-xs-1"> | ||||||
|  |                 <input type="button" class="btn" id="GetDataButton" value="Get Data" disabled /> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <div id="DetailsDiv" hidden> | ||||||
|  |             <span id="HeaderId" hidden></span> | ||||||
|  |             <span id="HeaderAttachmentId" hidden></span> | ||||||
|  |             <div style="padding-bottom: 20px;" id="DetailsGridDiv"> | ||||||
|  |                 <table id="DetailsGrid"></table> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|  |         <hr /> | ||||||
|  |         <footer> | ||||||
|  |             <p>© 2024 - Infineon Technologies</p> | ||||||
|  |         </footer> | ||||||
|  |     </div> | ||||||
|  |  | ||||||
|  |     <div id="MessageModal"></div> | ||||||
|  |  | ||||||
|  |     <script src="/js/bootstrap.min.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  |     <script src="/js/respond.min.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  |     <script src="/js/files.js?no-cache=2024-10-04-08-34" type="text/javascript"></script> | ||||||
|  | </body> | ||||||
|  |  | ||||||
|  | </html> | ||||||
| Before Width: | Height: | Size: 272 KiB After Width: | Height: | Size: 272 KiB | 
| Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB | 
| Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB | 
| Before Width: | Height: | Size: 210 B After Width: | Height: | Size: 210 B | 
| Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 225 B | 
| Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB | 
| Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB | 
| Before Width: | Height: | Size: 418 B After Width: | Height: | Size: 418 B | 
| Before Width: | Height: | Size: 985 B After Width: | Height: | Size: 985 B | 
| Before Width: | Height: | Size: 964 B After Width: | Height: | Size: 964 B |