6 Commits
e ... WinForms

Author SHA1 Message Date
37f6a68cd9 WinForms and Console 2024-03-14 15:30:40 -07:00
127634f5ab Delete self contained Thunder Tests
Back to .net8.0
api/v4/InfinityQS
ApiExplorerSettings
Wafer Counter
Color Sorting
2024-03-13 13:15:56 -07:00
7e16ee7f98 Layer with EpiProTempVerificationRows 2023-11-14 10:27:21 -07:00
cff2e06f68 Delete Work Material
Added InfinityQSV3-GetEpiProTempVerification
Added nigth shift
2023-11-13 09:44:37 -07:00
03bd20fc8c Archive 2023-11-02 14:41:32 -07:00
3dd4034a84 Tests passed using Mock 2023-11-01 08:27:25 -07:00
1024 changed files with 374458 additions and 139939 deletions

View File

@ -93,24 +93,26 @@ csharp_using_directive_placement = outside_namespace
dotnet_code_quality_unused_parameters = all dotnet_code_quality_unused_parameters = all
dotnet_code_quality_unused_parameters = non_public # IDE0060: Remove unused parameter dotnet_code_quality_unused_parameters = non_public # IDE0060: Remove unused parameter
dotnet_code_quality.CAXXXX.api_surface = private, internal dotnet_code_quality.CAXXXX.api_surface = private, internal
dotnet_diagnostic.CA1511.severity = none # CA1511: Use 'ArgumentException.ThrowIfNullOrEmpty' instead of explicitly throwing a new exception instance
dotnet_diagnostic.CA1825.severity = warning # CA1823: Avoid zero-length array allocations dotnet_diagnostic.CA1825.severity = warning # CA1823: Avoid zero-length array allocations
dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available dotnet_diagnostic.CA1829.severity = warning # CA1829: Use Length/Count property instead of Count() when available
dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable dotnet_diagnostic.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable
dotnet_diagnostic.CA1860.severity = error # CA1860: Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance dotnet_diagnostic.CA1860.severity = error # CA1860: Prefer comparing 'Count' to 0 rather than using 'Any()', both for clarity and for performance
dotnet_diagnostic.CA1862.severity = warning # CA1862: Prefer using 'string.Equals(string, StringComparison)' to perform a case-insensitive comparison, but keep in mind that this might cause subtle changes in behavior, so make sure to conduct thorough testing after applying the suggestion, or if culturally sensitive comparison is not required, consider using 'StringComparison.OrdinalIgnoreCase'
dotnet_diagnostic.CA1869.severity = none # CA1869: Avoid creating a new 'JsonSerializerOptions' instance for every serialization operation. Cache and reuse instances instead. dotnet_diagnostic.CA1869.severity = none # CA1869: Avoid creating a new 'JsonSerializerOptions' instance for every serialization operation. Cache and reuse instances instead.
dotnet_diagnostic.CA2254.severity = none # CA2254: The logging message template should not vary between calls to 'LoggerExtensions.LogInformation(ILogger, string?, params object?[])' dotnet_diagnostic.CA2254.severity = none # CA2254: The logging message template should not vary between calls to 'LoggerExtensions.LogInformation(ILogger, string?, params object?[])'
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 = warning # Using directive is unnecessary
dotnet_diagnostic.IDE0028.severity = error # 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
dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049) dotnet_diagnostic.IDE0049.severity = warning # Use language keywords instead of framework type names for type references (IDE0049)
dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter
dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290) dotnet_diagnostic.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290)
dotnet_diagnostic.IDE0300.severity = error # IDE0300: Collection initialization can be simplified dotnet_diagnostic.IDE0300.severity = none # IDE0300: Collection initialization can be simplified
dotnet_diagnostic.IDE0301.severity = error #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_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

3
.gitignore vendored
View File

@ -342,4 +342,5 @@ ASALocalRun/
# Libman.json # Libman.json
/wwwroot/lib/* /wwwroot/lib/*
.kanbn/**/* .kanbn
Tests/.kanbn

2
.vscode/launch.json vendored
View File

@ -10,7 +10,7 @@
"request": "launch", "request": "launch",
"preLaunchTask": "buildServer", "preLaunchTask": "buildServer",
// 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/net7.0/win-x64/OI.Metrology.Server.dll", "program": "${workspaceFolder}/Server/bin/Debug/net8.0/win-x64/OI.Metrology.Server.dll",
"args": [], "args": [],
"cwd": "${workspaceFolder}/Server", "cwd": "${workspaceFolder}/Server",
"stopAtEntry": false, "stopAtEntry": false,

12
.vscode/tasks.json vendored
View File

@ -51,6 +51,18 @@
], ],
"problemMatcher": "$msCompile" "problemMatcher": "$msCompile"
}, },
{
"label": "buildShared",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/Shared/OI.Metrology.Shared.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{ {
"label": "publishServer", "label": "publishServer",
"command": "dotnet", "command": "dotnet",

View File

@ -1,198 +0,0 @@
[
{
"_id": "646e3a9b-8fe9-4eb3-a532-f94270f752ac",
"colId": "history",
"containerId": "",
"name": "http://localhost:5126/api/inbound/cde",
"url": "http://localhost:5126/api/inbound/cde",
"method": "POST",
"sortNum": 0,
"created": "2023-02-28T14:41:33.596Z",
"modified": "2023-02-28T15:19:48.924Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"SentToMetrology\": false,\n \"SentToSPC\": false,\n \"AutoOptimizeGain\": \"YES\",\n \"AutoProbeHeightSet\": \"NO\",\n \"Avg\": \"1824.053\",\n \"CellName\": \"CDE2\",\n \"DLRatio\": \"0.9680\",\n \"DataReject\": \"> 3.0Sigma\",\n \"Date\": \"02/27/2023 03:03:00 AM\",\n \"Engineer\": \"Engineer\",\n \"EquipId\": \"CDE2\",\n \"FileName\": \"0 C:\\\\4p_NT\\\\LSL8in.prj\\\\10PT_5mm.rcp\\\\3227D036.RsM 03:03 02/27/23\",\n \"FilePath\": \"\",\n \"Id\": \"-1\",\n \"Layer\": \"\",\n \"LotId\": \"LotID\",\n \"Op\": \"Operator\",\n \"PSN\": \"4628\",\n \"RDS\": \"577845\",\n \"Reactor\": \"20\",\n \"Recipe\": \"LSL8in \\\\ 10PT_5mm\",\n \"ResistivitySpec\": \"\",\n \"Run\": \"20-577845-4628\",\n \"SemiRadial\": \"1.55%\",\n \"StDev\": \"1.33%\",\n \"Temp\": \"19.2\",\n \"UniqueId\": \"21.16;1;95.0;1803.847;270.0_Point-1\",\n \"Zone\": null,\n \"Details\": [\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"21.16\",\n \"Pt\": \"1\",\n \"R\": \"95.0\",\n \"Rs\": \"1803.847\",\n \"T\": \"270.0\",\n \"UniqueId\": \"21.16;1;95.0;1803.847;270.0_Point-1\"\n },\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"22.39\",\n \"Pt\": \"2\",\n \"R\": \"71.0\",\n \"Rs\": \"1858.424\",\n \"T\": \"270.0\",\n \"UniqueId\": \"22.39;2;71.0;1858.424;270.0_Point-2\"\n },\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"21.07\",\n \"Pt\": \"3\",\n \"R\": \"47.0\",\n \"Rs\": \"1834.141\",\n \"T\": \"270.0\",\n \"UniqueId\": \"21.07;3;47.0;1834.141;270.0_Point-3\"\n },\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"22.91\",\n \"Pt\": \"4\",\n \"R\": \"23.0\",\n \"Rs\": \"1803.609\",\n \"T\": \"270.0\",\n \"UniqueId\": \"22.91;4;23.0;1803.609;270.0_Point-4\"\n },\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"21.94\",\n \"Pt\": \"5\",\n \"R\": \"0.0\",\n \"Rs\": \"1801.623\",\n \"T\": \"0.0\",\n \"UniqueId\": \"21.94;5;0.0;1801.623;0.0_Point-5\"\n },\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"25.61\",\n \"Pt\": \"6\",\n \"R\": \"11.0\",\n \"Rs\": \"1803.997\",\n \"T\": \"90.0\",\n \"UniqueId\": \"25.61;6;11.0;1803.997;90.0_Point-6\"\n },\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"24.73\",\n \"Pt\": \"7\",\n \"R\": \"35.0\",\n \"Rs\": \"1819.854\",\n \"T\": \"90.0\",\n \"UniqueId\": \"24.73;7;35.0;1819.854;90.0_Point-7\"\n },\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"23.13\",\n \"Pt\": \"8\",\n \"R\": \"59.0\",\n \"Rs\": \"1855.965\",\n \"T\": \"90.0\",\n \"UniqueId\": \"23.13;8;59.0;1855.965;90.0_Point-8\"\n },\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"23.44\",\n \"Pt\": \"9\",\n \"R\": \"83.0\",\n \"Rs\": \"1853.631\",\n \"T\": \"90.0\",\n \"UniqueId\": \"23.44;9;83.0;1853.631;90.0_Point-9\"\n },\n {\n \"HeaderUniqueId\": \"ResMap_20-577845-4628_20230227030723\",\n \"Merit\": \"21.75\",\n \"Pt\": \"10\",\n \"R\": \"95.0\",\n \"Rs\": \"1805.438\",\n \"T\": \"90.0\",\n \"UniqueId\": \"21.75;10;95.0;1805.438;90.0_Point-10\"\n }\n ]\n}",
"form": []
},
"tests": []
},
{
"_id": "7f723103-2cd6-4d09-b780-28afe34b3cd7",
"colId": "history",
"containerId": "",
"name": "Delete",
"url": "https://tfs.intra.infineon.com/tfs/manufacturingit/APC%20Trend/_apis/test/runs/413094?api-version=6.0",
"method": "DELETE",
"sortNum": 0,
"created": "2023-03-02T15:43:07.175Z",
"modified": "2023-03-02T15:49:54.662Z",
"headers": [
{
"name": "Authorization",
"value": "Basic OmtzZHJveW9xMmJsdGI2N2xzN3NmZGhyYXlrY3l6cGlmemtkZjNndGs1bnl4ZnZmZHBqa2E="
}
],
"params": [
{
"name": "api-version",
"value": "6.0",
"isPath": false
}
],
"tests": []
},
{
"_id": "2874b1ad-b298-48c1-8edb-6fd78ce7d2d9",
"colId": "history",
"containerId": "",
"name": "Get",
"url": "https://tfs.intra.infineon.com/tfs/manufacturingit/Mesa_FI/_apis/test/runs?branchName=amaster&api-version=6.0",
"method": "GET",
"sortNum": 0,
"created": "2023-03-02T15:53:18.138Z",
"modified": "2023-03-02T16:12:27.892Z",
"headers": [
{
"name": "Authorization",
"value": "Basic OmtzZHJveW9xMmJsdGI2N2xzN3NmZGhyYXlrY3l6cGlmemtkZjNndGs1bnl4ZnZmZHBqa2E="
}
],
"params": [
{
"name": "branchName",
"value": "amaster",
"isPath": false
},
{
"name": "api-version",
"value": "6.0",
"isPath": false
}
],
"tests": []
},
{
"_id": "ed8728f5-9afa-4e69-bca3-9c059a9a831b",
"colId": "history",
"containerId": "",
"name": "Patch",
"url": "https://tfs.intra.infineon.com/tfs/manufacturingit/Mesa_FI/_apis/test/runs/410737?api-version=6.0",
"method": "PATCH",
"sortNum": 0,
"created": "2023-03-02T15:53:18.138Z",
"modified": "2023-03-02T15:58:09.720Z",
"headers": [
{
"name": "Authorization",
"value": "Basic OmtzZHJveW9xMmJsdGI2N2xzN3NmZGhyYXlrY3l6cGlmemtkZjNndGs1bnl4ZnZmZHBqa2E="
}
],
"params": [
{
"name": "api-version",
"value": "6.0",
"isPath": false
}
],
"body": {
"type": "json",
"raw": "{\n \"name\": \"MET08RESIHGCV\",\n \"comment\": \"40 passed\"\n}",
"form": []
},
"tests": []
},
{
"_id": "727621f0-63a3-4df2-9cfc-2610c532670d",
"colId": "history",
"containerId": "",
"name": "OI-RDS",
"url": "http://messa020ec.ec.local/api/oiWizard/materials/rds/578941",
"method": "GET",
"sortNum": 0,
"created": "2023-03-02T18:20:01.561Z",
"modified": "2023-03-06T18:40:43.162Z",
"headers": [],
"params": [],
"tests": [
{
"type": "json-query",
"custom": "json.rds.rdsLayers",
"action": "count",
"value": "1"
}
]
},
{
"_id": "4eafe190-e59e-4a3e-af76-356f62fde842",
"colId": "history",
"containerId": "",
"name": "https://oi-metrology-viewer-prod.mes.infineon.com/api/tooltypes",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/tooltypes",
"method": "GET",
"sortNum": 0,
"created": "2023-03-07T17:20:54.044Z",
"modified": "2023-03-07T17:20:54.044Z",
"headers": [],
"params": [],
"tests": []
},
{
"_id": "280ea9be-50e3-4813-8eb0-ffff739fe196",
"colId": "history",
"containerId": "",
"name": "GetHeaders",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/export/headers",
"method": "GET",
"sortNum": 0,
"created": "2023-03-07T17:21:05.219Z",
"modified": "2023-03-07T19:35:11.146Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4698\",\n \"RDS\": \"578824\",\n \"Reactor\": \"62\",\n \"ID\": 1678296039\n}",
"form": []
},
"tests": []
},
{
"_id": "6d8098aa-eb50-422e-b38d-32709d985e8e",
"colId": "history",
"containerId": "",
"name": "GetHeaders-Dev",
"url": "http://mestsa008/api/export/headers",
"method": "POST",
"sortNum": 0,
"created": "2023-03-07T17:21:05.219Z",
"modified": "2023-03-08T18:18:04.054Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4698\",\n \"RDS\": \"578824\",\n \"Reactor\": \"62\",\n \"ID\": 1678296039\n}",
"form": []
},
"tests": []
},
{
"_id": "61383ad6-ceb4-4d98-86c1-bf00c0e4204d",
"colId": "history",
"containerId": "",
"name": "GetHeaders-localhost",
"url": "http://localhost:5126/api/export/headers",
"method": "GET",
"sortNum": 0,
"created": "2023-03-07T17:21:05.219Z",
"modified": "2023-03-08T19:05:54.744Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4698\",\n \"RDS\": \"578824\",\n \"Reactor\": \"62\",\n \"ID\": -1678296039\n}",
"form": []
},
"tests": []
}
]

View File

@ -1,30 +0,0 @@
[
{
"_id": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"colName": "InfinityQS EC Only",
"created": "2023-02-27T20:07:11.913Z",
"sortNum": 10000,
"folders": []
},
{
"_id": "fb96b15a-0cc4-48c7-8767-34f1242750e8",
"colName": "Export EC",
"created": "2023-03-08T17:16:29.420Z",
"sortNum": 20000,
"folders": []
},
{
"_id": "5bfd00bc-b58c-49d3-9f27-5acadd060a51",
"colName": "Export IFX",
"created": "2023-03-08T17:31:19.468Z",
"sortNum": 30000,
"folders": []
},
{
"_id": "9ebfb84d-fa73-4c00-a2e0-e9ec69a31a16",
"colName": "LocalHost",
"created": "2023-05-08T19:34:00.425Z",
"sortNum": 40000,
"folders": []
}
]

View File

@ -1,440 +0,0 @@
[
{
"_id": "acbbcc8d-3daf-43be-9081-f4be2f8a95b9",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetCommandText",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQS/commandText/?sub_group_id=1677273357&process=61&job=CDE5&part=5012&lot=575908&date_time=2023-02-24 14:15:00",
"method": "GET",
"sortNum": 20000,
"created": "2023-02-27T20:07:11.921Z",
"modified": "2023-02-27T20:07:11.921Z",
"headers": [],
"params": [
{
"name": "sub_group_id",
"value": "1677273357",
"isPath": false
},
{
"name": "process",
"value": "61",
"isPath": false
},
{
"name": "job",
"value": "CDE5",
"isPath": false
},
{
"name": "part",
"value": "5012",
"isPath": false
},
{
"name": "lot",
"value": "575908",
"isPath": false
},
{
"name": "date_time",
"value": "2023-02-24 14:15:00",
"isPath": false
}
],
"tests": [
{
"type": "Content-Length",
"custom": "",
"action": ">",
"value": "100"
}
]
},
{
"_id": "29e56599-0093-481e-9386-9e6c1bb828a8",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetCommandTextV2",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV2/1677273357/commandText/?process=61&job=CDE5&part=5012&lot=575908&date_time=2023-02-24 14:15:00",
"method": "GET",
"sortNum": 30000,
"created": "2023-02-27T20:07:11.923Z",
"modified": "2023-02-27T20:07:11.923Z",
"headers": [],
"params": [
{
"name": "process",
"value": "61",
"isPath": false
},
{
"name": "job",
"value": "CDE5",
"isPath": false
},
{
"name": "part",
"value": "5012",
"isPath": false
},
{
"name": "lot",
"value": "575908",
"isPath": false
},
{
"name": "date_time",
"value": "2023-02-24 14:15:00",
"isPath": false
}
],
"tests": [
{
"type": "Content-Length",
"custom": "",
"action": ">",
"value": "100"
}
]
},
{
"_id": "2810520f-7a8b-4282-a593-92da3043e491",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetData",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQS/1677273357/data",
"method": "GET",
"sortNum": 40000,
"created": "2023-02-27T20:07:11.924Z",
"modified": "2023-02-27T20:07:11.924Z",
"headers": [],
"params": [],
"tests": [
{
"type": "json-query",
"custom": "json.",
"action": "count",
"value": "2"
}
]
},
{
"_id": "8628d1b1-cedb-45e3-9958-0ba4e233a2ac",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetDataV2",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV2/1677273357/data",
"method": "GET",
"sortNum": 41250,
"created": "2023-02-27T20:07:11.925Z",
"modified": "2023-02-27T20:07:11.925Z",
"headers": [],
"params": [],
"tests": [
{
"type": "json-query",
"custom": "json.",
"action": "count",
"value": "2"
}
]
},
{
"_id": "55c863ce-b828-4cdb-8a72-26da369c44ee",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetDescriptors",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQS/1677273357/descriptors",
"method": "GET",
"sortNum": 41875,
"created": "2023-02-27T20:07:11.926Z",
"modified": "2023-02-27T20:07:11.926Z",
"headers": [],
"params": [],
"tests": [
{
"type": "json-query",
"custom": "json.",
"action": "count",
"value": "2"
}
]
},
{
"_id": "b25fade2-44b5-4897-94a6-e31062c27e58",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetDescriptorsV2",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV2/1677273357/descriptors",
"method": "GET",
"sortNum": 42187.5,
"created": "2023-02-27T20:07:11.927Z",
"modified": "2023-02-27T20:07:11.927Z",
"headers": [],
"params": [],
"tests": [
{
"type": "json-query",
"custom": "json.",
"action": "count",
"value": "2"
}
]
},
{
"_id": "f24e826e-578c-45fe-a80a-ce31f0a13dfc",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetEvents",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQS/1677273357/events",
"method": "GET",
"sortNum": 42500,
"created": "2023-02-27T20:07:11.928Z",
"modified": "2023-02-27T20:07:11.928Z",
"headers": [],
"params": [],
"tests": [
{
"type": "json-query",
"custom": "json.",
"action": "count",
"value": "2"
}
]
},
{
"_id": "81118bd8-5919-4501-aa34-eaa2f4baeabf",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetEventsV2",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV2/1677273357/events",
"method": "GET",
"sortNum": 43750,
"created": "2023-02-27T20:07:11.929Z",
"modified": "2023-02-27T20:07:11.929Z",
"headers": [],
"params": [],
"tests": [
{
"type": "json-query",
"custom": "json.",
"action": "count",
"value": "2"
}
]
},
{
"_id": "26ded486-79ad-4fc8-b526-98187b8fde91",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetHeader",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQS/1677273357/header",
"method": "GET",
"sortNum": 45000,
"created": "2023-02-27T20:07:11.930Z",
"modified": "2023-02-27T20:07:11.930Z",
"headers": [],
"params": [],
"tests": [
{
"type": "json-query",
"custom": "json.",
"action": "count",
"value": "2"
}
]
},
{
"_id": "b8ee8160-6ca2-4276-be91-d1f6f2dd90dc",
"colId": "3743bec1-1f73-492a-9b9f-5889f239b5fc",
"containerId": "",
"name": "GetHeaderV2",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/InfinityQSV2/1677273357/header",
"method": "GET",
"sortNum": 55000,
"created": "2023-02-27T20:07:11.931Z",
"modified": "2023-02-27T20:07:11.931Z",
"headers": [],
"params": [],
"tests": [
{
"type": "json-query",
"custom": "json.",
"action": "count",
"value": "2"
}
]
},
{
"_id": "0aafd6ed-26a6-4a07-825c-8c1fee603b6a",
"colId": "fb96b15a-0cc4-48c7-8767-34f1242750e8",
"containerId": "",
"name": "GetHeaders",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/export/headers",
"method": "GET",
"sortNum": 10000,
"created": "2023-03-08T17:16:56.561Z",
"modified": "2023-03-08T17:17:39.783Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4698\",\n \"RDS\": \"578824\",\n \"Reactor\": \"62\",\n \"ID\": 1678296039\n}",
"form": []
},
"tests": []
},
{
"_id": "af298148-482d-4822-80ba-1abb86e1f9c2",
"colId": "fb96b15a-0cc4-48c7-8767-34f1242750e8",
"containerId": "",
"name": "GetExport",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/export/export",
"method": "GET",
"sortNum": 15000,
"created": "2023-03-08T17:17:47.597Z",
"modified": "2023-03-08T17:19:13.764Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4698\",\n \"RDS\": \"578824\",\n \"Reactor\": \"62\",\n \"ID\": 1678296039\n}",
"form": []
},
"tests": []
},
{
"_id": "a787c81d-381e-451d-9d96-e607f06efdaf",
"colId": "fb96b15a-0cc4-48c7-8767-34f1242750e8",
"containerId": "",
"name": "GetLogistics",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/export/logistics",
"method": "GET",
"sortNum": 30000,
"created": "2023-03-08T17:18:38.179Z",
"modified": "2023-03-08T17:19:21.874Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4698\",\n \"RDS\": \"578824\",\n \"Reactor\": \"62\",\n \"ID\": 1678296039\n}",
"form": []
},
"tests": []
},
{
"_id": "7e19c7d4-2d93-46e1-88fd-ba5312885713",
"colId": "fb96b15a-0cc4-48c7-8767-34f1242750e8",
"containerId": "",
"name": "GetProcessDataStandardFormat",
"url": "https://oi-metrology-viewer-prod.mes.infineon.com/api/export/pdsf",
"method": "GET",
"sortNum": 40000,
"created": "2023-03-08T17:18:49.042Z",
"modified": "2023-03-08T17:19:27.119Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4698\",\n \"RDS\": \"578824\",\n \"Reactor\": \"62\",\n \"ID\": 1678296039\n}",
"form": []
},
"tests": []
},
{
"_id": "25eb571f-064c-4b3f-8c20-666c66c1b123",
"colId": "5bfd00bc-b58c-49d3-9f27-5acadd060a51",
"containerId": "",
"name": "GetHeaders",
"url": "https://messa017.infineon.com/api/export/headers",
"method": "GET",
"sortNum": 10000,
"created": "2023-03-08T17:31:19.471Z",
"modified": "2023-04-07T15:10:34.584Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4830\",\n \"Reactor\": \"41\",\n \"RDS\": \"584740\",\n \"ID\": 1680657537,\n \"Path\": \"\\\\\\\\messdv002.na.infineon.com\\\\Candela\\\\Archive\\\\API\\\\2023_Week_14\\\\-4830\\\\-41\\\\-584740\\\\-1680657537\\\\638162291037289598.json\"\n}",
"form": []
},
"tests": []
},
{
"_id": "f5feb8e3-0e82-4b47-a15e-97ef069a1539",
"colId": "5bfd00bc-b58c-49d3-9f27-5acadd060a51",
"containerId": "",
"name": "GetExport",
"url": "https://messa017.infineon.com/api/export/export",
"method": "GET",
"sortNum": 15000,
"created": "2023-03-08T17:31:19.472Z",
"modified": "2023-04-07T15:10:45.402Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4830\",\n \"Reactor\": \"41\",\n \"RDS\": \"584740\",\n \"ID\": 1680657537,\n \"Path\": \"\\\\\\\\messdv002.na.infineon.com\\\\Candela\\\\Archive\\\\API\\\\2023_Week_14\\\\-4830\\\\-41\\\\-584740\\\\-1680657537\\\\638162291037289598.json\"\n}",
"form": []
},
"tests": []
},
{
"_id": "7fddba99-14a2-4c6a-bf4a-4b94391929cf",
"colId": "5bfd00bc-b58c-49d3-9f27-5acadd060a51",
"containerId": "",
"name": "GetLogistics",
"url": "https://messa017.infineon.com/api/export/logistics",
"method": "GET",
"sortNum": 30000,
"created": "2023-03-08T17:31:19.473Z",
"modified": "2023-04-07T15:10:49.000Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4830\",\n \"Reactor\": \"41\",\n \"RDS\": \"584740\",\n \"ID\": 1680657537,\n \"Path\": \"\\\\\\\\messdv002.na.infineon.com\\\\Candela\\\\Archive\\\\API\\\\2023_Week_14\\\\-4830\\\\-41\\\\-584740\\\\-1680657537\\\\638162291037289598.json\"\n}",
"form": []
},
"tests": []
},
{
"_id": "07d5b0c3-684a-4cad-8a48-b164e8da87b0",
"colId": "5bfd00bc-b58c-49d3-9f27-5acadd060a51",
"containerId": "",
"name": "GetProcessDataStandardFormat",
"url": "https://messa017.infineon.com/api/export/pdsf",
"method": "GET",
"sortNum": 40000,
"created": "2023-03-08T17:31:19.474Z",
"modified": "2023-04-07T15:10:53.080Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"PSN\": \"4830\",\n \"Reactor\": \"41\",\n \"RDS\": \"584740\",\n \"ID\": 1680657537,\n \"Path\": \"\\\\\\\\messdv002.na.infineon.com\\\\Candela\\\\Archive\\\\API\\\\2023_Week_14\\\\-4830\\\\-41\\\\-584740\\\\-1680657537\\\\638162291037289598.json\"\n}",
"form": []
},
"tests": []
},
{
"_id": "524e5261-69eb-4888-8818-608cde1ce506",
"colId": "9ebfb84d-fa73-4c00-a2e0-e9ec69a31a16",
"containerId": "",
"name": "Inbound-SRP",
"url": "http://localhost:5126/api/inbound/SRP",
"method": "POST",
"sortNum": 10000,
"created": "2023-05-08T19:34:14.843Z",
"modified": "2023-05-08T19:50:20.646Z",
"headers": [],
"params": [],
"body": {
"type": "json",
"raw": "{\n \"SentToMetrology\": false,\n \"SentToSPC\": false,\n \"Id\": 0,\n \"Batch\": \"BIORAD#2\",\n \"Cassette\": \"BIORAD2\",\n \"CellName\": \"BIORAD2\",\n \"Date\": \"05/08/2023 12:23:23 AM\",\n \"FilePath\": \"\",\n \"Layer\": \"1\",\n \"MeanThickness\": \"21.8224\",\n \"Op\": \"C\",\n \"PSN\": \"5010\",\n \"PassFail\": \"PASS\",\n \"RDS\": \"588252\",\n \"RVThickness\": \"2.0559\",\n \"Reactor\": \"23\",\n \"Recipe\": \"PROD_8inch\",\n \"StdDev\": \"0.1483\",\n \"Title\": \"Bio-RadQS400MEPI\",\n \"UniqueId\": \"Bio-RadQS400MEPI_23-588252-5010.1_202305080023237034_5.4661928_Point-1\",\n \"Wafer\": \"23-588252-5010.1\",\n \"Zone\": \"-\",\n \"Details\": []\n}",
"form": []
},
"tests": []
}
]

View File

@ -35,8 +35,8 @@ public class InboundController : ControllerBase
{ {
public bool Success { get; set; } public bool Success { get; set; }
public long HeaderID { get; set; } public long HeaderID { get; set; }
public List<string> Errors { get; set; } public List<string>? Errors { get; set; }
public List<string> Warnings { get; set; } public List<string>? Warnings { get; set; }
} }
// this is the main endpoint, it accepts a JSON message that contains both the header and data records together // this is the main endpoint, it accepts a JSON message that contains both the header and data records together
@ -86,7 +86,7 @@ public class InboundController : ControllerBase
else else
r.Errors.Add("Invalid json"); r.Errors.Add("Invalid json");
if (r.Errors.Count == 0) if (r.Errors.Count == 0 && jsonbody is not null)
{ {
try try
{ {
@ -147,14 +147,14 @@ public class InboundController : ControllerBase
if (string.IsNullOrWhiteSpace(_AppSettings.InboundApiAllowedIPList)) if (string.IsNullOrWhiteSpace(_AppSettings.InboundApiAllowedIPList))
return true; return true;
System.Net.IPAddress remoteIP = HttpContext.Connection.RemoteIpAddress; System.Net.IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress;
byte[] remoteIPBytes = remoteIP.GetAddressBytes(); byte[]? remoteIPBytes = remoteIP?.GetAddressBytes();
string[] allowedIPs = _AppSettings.InboundApiAllowedIPList.Split(';'); string[] allowedIPs = _AppSettings.InboundApiAllowedIPList.Split(';');
foreach (string ip in allowedIPs) foreach (string ip in allowedIPs)
{ {
System.Net.IPAddress parsedIP; System.Net.IPAddress? parsedIP;
if (System.Net.IPAddress.TryParse(ip, out parsedIP)) if (remoteIPBytes is not null && System.Net.IPAddress.TryParse(ip, out parsedIP))
{ {
if (parsedIP.GetAddressBytes().SequenceEqual(remoteIPBytes)) if (parsedIP.GetAddressBytes().SequenceEqual(remoteIPBytes))
return true; return true;

View File

@ -203,7 +203,7 @@ public class ToolTypesController : Controller
if (ds.Tables[0].Rows.Count != 1) if (ds.Tables[0].Rows.Count != 1)
throw new Exception("Error exporting, invalid filename"); throw new Exception("Error exporting, invalid filename");
string filename = Convert.ToString(ds.Tables[0].Rows[0][0]); string? filename = Convert.ToString(ds.Tables[0].Rows[0][0]);
// The second table has the header data // The second table has the header data
if (ds.Tables[1].Rows.Count != 1) if (ds.Tables[1].Rows.Count != 1)
@ -211,7 +211,7 @@ public class ToolTypesController : Controller
System.Text.StringBuilder sb = new(); System.Text.StringBuilder sb = new();
foreach (object o in ds.Tables[1].Rows[0].ItemArray) foreach (object? o in ds.Tables[1].Rows[0].ItemArray)
{ {
if ((o is not null) && (!Convert.IsDBNull(o))) if ((o is not null) && (!Convert.IsDBNull(o)))
_ = sb.Append(Convert.ToString(o)); _ = sb.Append(Convert.ToString(o));
@ -221,7 +221,7 @@ public class ToolTypesController : Controller
// The third table has the detail data // The third table has the detail data
foreach (System.Data.DataRow dr in ds.Tables[2].Rows) foreach (System.Data.DataRow dr in ds.Tables[2].Rows)
{ {
foreach (object o in dr.ItemArray) foreach (object? o in dr.ItemArray)
{ {
if ((o is not null) && (!Convert.IsDBNull(o))) if ((o is not null) && (!Convert.IsDBNull(o)))
_ = sb.Append(Convert.ToString(o)); _ = sb.Append(Convert.ToString(o));

View File

@ -43,7 +43,8 @@ public class ApiLoggingMiddleware
else else
{ {
// if there are content type filters configured, only log is the request begins with one of them // if there are content type filters configured, only log is the request begins with one of them
doLogging = _AppSettings.ApiLoggingContentTypes.Split(';').Any(ct => httpContext.Request.ContentType.StartsWith(ct)); string? contentType = httpContext.Request.ContentType;
doLogging = contentType is not null && _AppSettings.ApiLoggingContentTypes.Split(';').Any(ct => contentType.StartsWith(ct));
} }
} }
} }

View File

@ -14,7 +14,7 @@ public class ErrorHandlerController : Controller
public IActionResult Index() public IActionResult Index()
{ {
IExceptionHandlerFeature error = HttpContext.Features.Get<IExceptionHandlerFeature>(); IExceptionHandlerFeature? error = HttpContext.Features.Get<IExceptionHandlerFeature>();
if (error is null) if (error is null)
{ {
return Redirect("~/"); return Redirect("~/");

View File

@ -52,7 +52,7 @@ public class ExportController : Controller
[Route("/ExportData")] [Route("/ExportData")]
public ActionResult ExportData(Export model) public ActionResult ExportData(Export model)
{ {
ToolType toolType = null; ToolType? toolType = null;
if (string.IsNullOrEmpty(model.ToolType)) if (string.IsNullOrEmpty(model.ToolType))
ModelState.AddModelError("Exception", "Invalid selection"); ModelState.AddModelError("Exception", "Invalid selection");
else else
@ -66,7 +66,7 @@ public class ExportController : Controller
else if (string.IsNullOrWhiteSpace(toolType.ExportSPName)) else if (string.IsNullOrWhiteSpace(toolType.ExportSPName))
ModelState.AddModelError("ToolType", "Tool type is not exportable"); ModelState.AddModelError("ToolType", "Tool type is not exportable");
} }
if (ModelState.IsValid) if (ModelState.IsValid && toolType?.ToolTypeName is not null && toolType.ExportSPName is not null)
{ {
try try
{ {
@ -114,10 +114,13 @@ public class ExportController : Controller
{ {
if (i > 0) if (i > 0)
_ = r.Append(','); _ = r.Append(',');
object v = dr[i]; object v = dr[i];
if (!Convert.IsDBNull(v)) if (!Convert.IsDBNull(v))
_ = r.Append(FormatForCSV(Convert.ToString(v))); {
string? c = Convert.ToString(v);
if (c is not null)
_ = r.Append(FormatForCSV(c));
}
} }
return r.ToString(); return r.ToString();
} }

View File

@ -0,0 +1,2 @@
[*.cs]
csharp_preserve_single_line_statements = true

View File

@ -1,6 +1,5 @@
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using System; using System;
using System.ComponentModel.DataAnnotations;
using System.Text.Json; using System.Text.Json;
namespace OI.Metrology.Archive.Models.Binder; namespace OI.Metrology.Archive.Models.Binder;
@ -8,25 +7,21 @@ namespace OI.Metrology.Archive.Models.Binder;
public class AppSettings public class AppSettings
{ {
#nullable disable public string? ApiLoggingContentTypes { get; set; }
public string? ApiLoggingPathPrefixes { get; set; }
[Display(Name = "Api Logging Content Types"), Required] public string ApiLoggingContentTypes { get; set; } public string? ApiLogPath { get; set; }
[Display(Name = "Api Logging Path Prefixes"), Required] public string ApiLoggingPathPrefixes { get; set; } public string? AttachmentPath { get; set; }
[Display(Name = "Api Log Path"), Required] public string ApiLogPath { get; set; } public string? BuildNumber { get; set; }
[Display(Name = "Attachment Path"), Required] public string AttachmentPath { get; set; } public string? Company { get; set; }
[Display(Name = "Build Number"), Required] public string BuildNumber { get; set; } public string? ConnectionString { get; set; }
[Display(Name = "Company"), Required] public string Company { get; set; } public string? GitCommitSeven { get; set; }
[Display(Name = "Connection String"), Required] public string ConnectionString { get; set; } public string? InboundApiAllowedIPList { get; set; }
[Display(Name = "Git Commit Seven"), Required] public string GitCommitSeven { get; set; } public string? MonAResource { get; set; }
[Display(Name = "Inbound Api Allowed IP List"), Required] public string InboundApiAllowedIPList { get; set; } public string? MonASite { get; set; }
[Display(Name = "MonA Resource"), Required] public string MonAResource { get; set; } public string? Oi2SqlConnectionString { get; set; }
[Display(Name = "MonA Site"), Required] public string MonASite { get; set; } public string? OIExportPath { get; set; }
[Display(Name = "Oi 2 Sql Connection String"), Required] public string Oi2SqlConnectionString { get; set; } public string? URLs { get; set; }
[Display(Name = "OI Export Path"), Required] public string OIExportPath { get; set; } public string? WorkingDirectoryName { get; set; }
[Display(Name = "URLs"), Required] public string URLs { get; set; }
[Display(Name = "Working Directory Name"), Required] public string WorkingDirectoryName { get; set; }
#nullable restore
public override string ToString() public override string ToString()
{ {
@ -34,41 +29,25 @@ public class AppSettings
return result; return result;
} }
private static Models.AppSettings Get(AppSettings appSettings) private static Models.AppSettings Get(AppSettings? appSettings)
{ {
Models.AppSettings result; Models.AppSettings result;
if (appSettings is null) if (appSettings is null) throw new NullReferenceException(nameof(appSettings));
throw new NullReferenceException(nameof(appSettings)); if (appSettings.ApiLoggingContentTypes is null) throw new NullReferenceException(nameof(ApiLoggingContentTypes));
if (appSettings.ApiLoggingContentTypes is null) if (appSettings.ApiLoggingPathPrefixes is null) throw new NullReferenceException(nameof(ApiLoggingPathPrefixes));
throw new NullReferenceException(nameof(ApiLoggingContentTypes)); if (appSettings.ApiLogPath is null) throw new NullReferenceException(nameof(ApiLogPath));
if (appSettings.ApiLoggingPathPrefixes is null) if (appSettings.AttachmentPath is null) throw new NullReferenceException(nameof(AttachmentPath));
throw new NullReferenceException(nameof(ApiLoggingPathPrefixes)); if (appSettings.BuildNumber is null) throw new NullReferenceException(nameof(BuildNumber));
if (appSettings.ApiLogPath is null) if (appSettings.Company is null) throw new NullReferenceException(nameof(Company));
throw new NullReferenceException(nameof(ApiLogPath)); if (appSettings.ConnectionString is null) throw new NullReferenceException(nameof(ConnectionString));
if (appSettings.AttachmentPath is null) if (appSettings.GitCommitSeven is null) throw new NullReferenceException(nameof(GitCommitSeven));
throw new NullReferenceException(nameof(AttachmentPath)); if (appSettings.InboundApiAllowedIPList is null) throw new NullReferenceException(nameof(InboundApiAllowedIPList));
if (appSettings.BuildNumber is null) if (appSettings.MonAResource is null) throw new NullReferenceException(nameof(MonAResource));
throw new NullReferenceException(nameof(BuildNumber)); if (appSettings.MonASite is null) throw new NullReferenceException(nameof(MonASite));
if (appSettings.Company is null) if (appSettings.Oi2SqlConnectionString is null) throw new NullReferenceException(nameof(Oi2SqlConnectionString));
throw new NullReferenceException(nameof(Company)); if (appSettings.OIExportPath is null) throw new NullReferenceException(nameof(OIExportPath));
if (appSettings.ConnectionString is null) if (appSettings.URLs is null) throw new NullReferenceException(nameof(URLs));
throw new NullReferenceException(nameof(ConnectionString)); if (appSettings.WorkingDirectoryName is null) throw new NullReferenceException(nameof(WorkingDirectoryName));
if (appSettings.GitCommitSeven is null)
throw new NullReferenceException(nameof(GitCommitSeven));
if (appSettings.InboundApiAllowedIPList is null)
throw new NullReferenceException(nameof(InboundApiAllowedIPList));
if (appSettings.MonAResource is null)
throw new NullReferenceException(nameof(MonAResource));
if (appSettings.MonASite is null)
throw new NullReferenceException(nameof(MonASite));
if (appSettings.Oi2SqlConnectionString is null)
throw new NullReferenceException(nameof(Oi2SqlConnectionString));
if (appSettings.OIExportPath is null)
throw new NullReferenceException(nameof(OIExportPath));
if (appSettings.URLs is null)
throw new NullReferenceException(nameof(URLs));
if (appSettings.WorkingDirectoryName is null)
throw new NullReferenceException(nameof(WorkingDirectoryName));
result = new( result = new(
appSettings.ApiLoggingContentTypes, appSettings.ApiLoggingContentTypes,
appSettings.ApiLoggingPathPrefixes, appSettings.ApiLoggingPathPrefixes,
@ -91,7 +70,23 @@ public class AppSettings
public static Models.AppSettings Get(IConfigurationRoot configurationRoot) public static Models.AppSettings Get(IConfigurationRoot configurationRoot)
{ {
Models.AppSettings result; Models.AppSettings result;
AppSettings appSettings = configurationRoot.Get<AppSettings>(); #pragma warning disable IL3050, IL2026
AppSettings? appSettings = configurationRoot.Get<AppSettings>();
#pragma warning restore IL3050, IL2026
if (appSettings?.ApiLoggingContentTypes is null)
{
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;
if (!physicalFileProvider.Root.Contains("UserSecrets"))
continue;
throw new NotSupportedException(physicalFileProvider.Root);
}
throw new NotSupportedException("Not found!");
}
result = Get(appSettings); result = Get(appSettings);
return result; return result;
} }

View File

@ -8,8 +8,7 @@
<PropertyGroup> <PropertyGroup>
<ImplicitUsings>disable</ImplicitUsings> <ImplicitUsings>disable</ImplicitUsings>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<LangVersion>10.0</LangVersion> <Nullable>enable</Nullable>
<Nullable>disable</Nullable>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
@ -27,19 +26,14 @@
<Content Remove="compilerconfig.json" /> <Content Remove="compilerconfig.json" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.1.15" /> <PackageReference Include="Dapper" Version="2.1.24" />
<PackageReference Include="EntityFramework" Version="6.4.4" /> <PackageReference Include="EntityFramework" Version="6.4.4" />
<PackageReference Include="jQuery" Version="3.7.1" /> <PackageReference Include="jQuery" Version="3.7.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="6.0.0" />
<PackageReference Include="Serilog.AspNetCore.Ingestion" Version="1.0.0-dev-00032" />
<PackageReference Include="Serilog.Settings.Configuration" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" /> <PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
</ItemGroup> </ItemGroup>

View File

@ -12,7 +12,6 @@ using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories; using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Services; using OI.Metrology.Shared.Services;
using Serilog;
using System; using System;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
@ -22,13 +21,11 @@ namespace OI.Metrology.Archive;
public class Program public class Program
{ {
internal readonly AppSettings _AppSettings;
private static (string, WebApplicationOptions) Get(string[] args) private static (string, WebApplicationOptions) Get(string[] args)
{ {
string webRootPath; string webRootPath;
Assembly assembly = Assembly.GetExecutingAssembly(); Assembly assembly = Assembly.GetExecutingAssembly();
string assemblyName = assembly.GetName()?.Name; string? assemblyName = assembly.GetName()?.Name;
if (string.IsNullOrEmpty(assemblyName)) if (string.IsNullOrEmpty(assemblyName))
throw new Exception(); throw new Exception();
string baseAssemblyName = assemblyName.Split('.')[0]; string baseAssemblyName = assemblyName.Split('.')[0];
@ -49,7 +46,7 @@ public class Program
public static int Main(string[] args) public static int Main(string[] args)
{ {
LoggerConfiguration loggerConfiguration = new(); ILogger<Program>? logger = null;
(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>();
@ -58,10 +55,6 @@ public class Program
throw new Exception("Working directory name must have a value!"); throw new Exception("Working directory name must have a value!");
string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assemblyName, _AppSettings.WorkingDirectoryName); string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assemblyName, _AppSettings.WorkingDirectoryName);
Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory);
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, webApplicationBuilder.Configuration);
_ = SerilogHostBuilderExtensions.UseSerilog(webApplicationBuilder.Host);
Log.Logger = loggerConfiguration.CreateLogger();
Serilog.ILogger log = Log.ForContext<Program>();
try try
{ {
_ = webApplicationBuilder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true); _ = webApplicationBuilder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true);
@ -95,6 +88,7 @@ public class Program
#pragma warning restore #pragma warning restore
} }
WebApplication webApplication = webApplicationBuilder.Build(); WebApplication webApplication = webApplicationBuilder.Build();
logger = webApplication.Services.GetRequiredService<ILogger<Program>>();
if (!webApplicationBuilder.Environment.IsDevelopment()) if (!webApplicationBuilder.Environment.IsDevelopment())
{ {
_ = webApplication.UseExceptionHandler("/Error"); _ = webApplication.UseExceptionHandler("/Error");
@ -110,27 +104,22 @@ public class Program
_ = webApplication.UseSwagger(); _ = webApplication.UseSwagger();
_ = webApplication.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Archive V1")); _ = webApplication.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Archive V1"));
} }
_ = webApplication.Lifetime.ApplicationStopped.Register(Log.CloseAndFlush);
_ = ApplicationBuilderSerilogClientExtensions.UseSerilogIngestion(webApplication);
_ = SerilogApplicationBuilderExtensions.UseSerilogRequestLogging(webApplication);
_ = webApplication.UseFileServer(enableDirectoryBrowsing: true); _ = webApplication.UseFileServer(enableDirectoryBrowsing: true);
_ = webApplication.UseStaticFiles(); _ = webApplication.UseStaticFiles();
_ = webApplication.UseSession(); _ = webApplication.UseSession();
_ = webApplication.UseHttpsRedirection(); _ = webApplication.UseHttpsRedirection();
_ = webApplication.UseMiddleware<ApiLoggingMiddleware>(); _ = webApplication.UseMiddleware<ApiLoggingMiddleware>();
_ = webApplication.MapControllers(); _ = webApplication.MapControllers();
log.Information("Starting Web Application"); logger.LogInformation("Starting Web Application");
webApplication.Run(); webApplication.Run();
return 0; return 0;
} }
catch (Exception ex) catch (Exception ex)
{ {
log.Fatal(ex, "Host terminated unexpectedly"); try
return 1; { logger?.LogCritical(ex, "Host terminated unexpectedly"); }
} catch (Exception) { }
finally throw;
{
Log.CloseAndFlush();
} }
} }

View File

@ -13,6 +13,8 @@ using System.Transactions;
namespace OI.Metrology.Archive.Repositories; namespace OI.Metrology.Archive.Repositories;
#nullable disable
public class MetrologyRepository : IMetrologyRepository public class MetrologyRepository : IMetrologyRepository
{ {
private readonly IDbConnectionFactory _DBConnectionFactory; private readonly IDbConnectionFactory _DBConnectionFactory;

View File

@ -11,6 +11,8 @@ using System.Text;
namespace OI.Metrology.Archive.Repositories; namespace OI.Metrology.Archive.Repositories;
#nullable disable
public class RdsMaxRepo : IRdsMaxRepo public class RdsMaxRepo : IRdsMaxRepo
{ {

View File

@ -6,6 +6,8 @@ using System.Data.SqlClient;
namespace OI.Metrology.Archive.Repositories; namespace OI.Metrology.Archive.Repositories;
#nullable disable
public class SQLDbConnectionFactory : IDbConnectionFactory public class SQLDbConnectionFactory : IDbConnectionFactory
{ {
private readonly AppSettings _AppSettings; private readonly AppSettings _AppSettings;

View File

@ -4,6 +4,8 @@ using System.IO;
namespace OI.Metrology.Archive.Services; namespace OI.Metrology.Archive.Services;
#nullable disable
using OI.Metrology.Archive.Models; using OI.Metrology.Archive.Models;
using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;

View File

@ -8,6 +8,8 @@ using System.Linq;
namespace OI.Metrology.Archive.Services; namespace OI.Metrology.Archive.Services;
#nullable disable
public class InboundDataService : IInboundDataService public class InboundDataService : IInboundDataService
{ {
private readonly IMetrologyRepository _MetrologyRepository; private readonly IMetrologyRepository _MetrologyRepository;

View File

@ -71,7 +71,7 @@
<li>@Html.ActionLink("Export", "Index", "Export", new { area = "" }, null)</li> <li>@Html.ActionLink("Export", "Index", "Export", new { area = "" }, null)</li>
</ul> </ul>
<p class="navbar-text navbar-right"> <p class="navbar-text navbar-right">
@User.Identity.Name @User.Identity?.Name
</p> </p>
</div> </div>
</div> </div>

30
Console/.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,30 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (console)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"program": "${workspaceFolder}/bin/Debug/net8.0/win-x64/OI.Metrology.Console.dll",
"args": [
"s",
"M",
"L:/Git/Notes-EC-Documentation/.EC-Documentation",
"-s",
"L:/Git/Notes-EC-Documentation/.EC-Documentation/port"
],
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",
"stopAtEntry": false
},
{
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach"
}
]
}

4
Console/.vscode/mklink.md vendored Normal file
View File

@ -0,0 +1,4 @@
# mklink
```bash
```

37
Console/.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,37 @@
{
"[markdown]": {
"editor.wordWrap": "off"
},
"files.exclude": {
"**/.git": false,
"**/node_modules": true
},
"files.watcherExclude": {
"**/node_modules": true
},
"cSpell.words": [
"ASPNETCORE",
"BIRT",
"CHIL",
"DEAT",
"endianness",
"FAMC",
"FAMS",
"GIVN",
"HUSB",
"INDI",
"Infineon",
"Kanban",
"kanbn",
"Kofax",
"NSFX",
"OBJE",
"onenote",
"pged",
"Phares",
"Serilog",
"SUBM",
"SURN",
"SYSLIB"
]
}

99
Console/.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,99 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "User Secrets Init",
"command": "dotnet",
"type": "process",
"args": [
"user-secrets",
"-p",
"${workspaceFolder}/OI.Metrology.Console.csproj",
"init"
],
"problemMatcher": "$msCompile"
},
{
"label": "User Secrets Set",
"command": "dotnet",
"type": "process",
"args": [
"user-secrets",
"-p",
"${workspaceFolder}/OI.Metrology.Console.csproj",
"set",
"asdf",
"123"
],
"problemMatcher": "$msCompile"
},
{
"label": "Format",
"command": "dotnet",
"type": "process",
"args": [
"format",
"--report",
".vscode",
"--verbosity",
"detailed",
"--severity",
"warn"
],
"problemMatcher": "$msCompile"
},
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/OI.Metrology.Console.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/OI.Metrology.Console.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/OI.Metrology.Console.csproj"
],
"problemMatcher": "$msCompile"
},
{
"label": "Publish AOT",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"-r",
"win-x64",
"-c",
"Release",
"-p:PublishAot=true",
"${workspaceFolder}/OI.Metrology.Console.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
}
]
}

View File

@ -0,0 +1,21 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace OI.Metrology.Console.Models;
public record AppSettings(string Company)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, AppSettingsSourceGenerationContext.Default.AppSettings);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(AppSettings))]
internal partial class AppSettingsSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -0,0 +1,2 @@
[*.cs]
csharp_preserve_single_line_statements = true

View File

@ -0,0 +1,61 @@
using Microsoft.Extensions.Configuration;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace OI.Metrology.Console.Models.Binder;
public class AppSettings
{
public string? Company { get; set; }
public override string ToString()
{
string result = JsonSerializer.Serialize(this, BinderAppSettingsSourceGenerationContext.Default.AppSettings);
return result;
}
private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings)
{
if (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())}");
}
}
private static Models.AppSettings Get(AppSettings? appSettings)
{
Models.AppSettings result;
if (appSettings is null) throw new NullReferenceException(nameof(appSettings));
if (appSettings.Company is null) throw new NullReferenceException(nameof(Company));
result = new(appSettings.Company);
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
{
}

View File

@ -0,0 +1,50 @@
namespace OI.Metrology.Console.Models;
internal abstract class WorkingDirectory
{
internal static string GetWorkingDirectory(string? executingAssemblyName, string subDirectoryName)
{
string result = string.Empty;
if (executingAssemblyName is null)
throw new Exception();
string traceFile;
List<string> directories = [];
Environment.SpecialFolder[] specialFolders =
[
Environment.SpecialFolder.LocalApplicationData,
Environment.SpecialFolder.ApplicationData,
Environment.SpecialFolder.History,
Environment.SpecialFolder.CommonApplicationData,
Environment.SpecialFolder.InternetCache
];
foreach (Environment.SpecialFolder specialFolder in specialFolders)
directories.Add(Path.Combine(Environment.GetFolderPath(specialFolder), subDirectoryName, executingAssemblyName));
foreach (string directory in directories)
{
for (int i = 1; i < 3; i++)
{
if (i == 1)
result = directory;
else
result = string.Concat("D", directory[1..]);
try
{
if (!Directory.Exists(result))
_ = Directory.CreateDirectory(result);
traceFile = string.Concat(result, @"\", DateTime.Now.Ticks, ".txt");
File.WriteAllText(traceFile, traceFile);
File.Delete(traceFile);
break;
}
catch (Exception) { result = string.Empty; }
}
if (!string.IsNullOrEmpty(result))
break;
}
if (string.IsNullOrEmpty(result))
throw new Exception("Unable to set working directory!");
return result;
}
}

View File

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<OutputType>Exe</OutputType>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<TargetFramework>net8.0</TargetFramework>
<UserSecretsId>d9488860-fd41-4dd8-9448-19f1dde7a0f7</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.3" />
<PackageReference Include="System.Text.Json" Version="8.0.3" />
</ItemGroup>
</Project>

29
Console/Program.cs Normal file
View File

@ -0,0 +1,29 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using OI.Metrology.Console.Models;
namespace OI.Metrology.Console;
internal class Program
{
public static void Main(string[] args)
{
#pragma warning disable IL3050
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
#pragma warning restore IL3050
_ = builder.Configuration.AddEnvironmentVariables();
_ = builder.Configuration.AddUserSecrets<Program>();
_ = builder.Services.AddSingleton(args.ToList());
AppSettings appSettings = Models.Binder.AppSettings.Get(builder.Configuration);
_ = builder.Services.AddSingleton(appSettings);
_ = builder.Services.AddHostedService<Worker>();
using IHost host = builder.Build();
ILogger<Program> logger = host.Services.GetRequiredService<ILogger<Program>>();
logger.LogCritical("{appSettings.Company}", appSettings.Company);
host.Run();
}
}

67
Console/Worker.cs Normal file
View File

@ -0,0 +1,67 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using OI.Metrology.Console.Models;
using System.Diagnostics;
namespace OI.Metrology.Console;
public class Worker : BackgroundService
{
private readonly List<string> _Args;
private readonly ILogger<Worker> _Logger;
private readonly AppSettings _AppSettings;
private readonly IHostApplicationLifetime _Lifetime;
public Worker(ILogger<Worker> logger, IHostApplicationLifetime lifetime, List<string> args, AppSettings appSettings)
{
_Args = args;
_Logger = logger;
_Lifetime = lifetime;
_AppSettings = appSettings;
}
public override Task StartAsync(CancellationToken cancellationToken) =>
base.StartAsync(cancellationToken);
public override Task StopAsync(CancellationToken cancellationToken) =>
base.StopAsync(cancellationToken);
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
if (!stoppingToken.IsCancellationRequested)
await Task.Delay(500, stoppingToken);
if (_AppSettings is null)
throw new NullReferenceException(nameof(_AppSettings));
try
{
_Logger.LogInformation("BaseDirectory: <{BaseDirectory}>", AppContext.BaseDirectory);
_Logger.LogInformation("CurrentDirectory: <{CurrentDirectory}>", Environment.CurrentDirectory);
_Logger.LogInformation("Press Escape key to get -1, Enter key to get 0, y key to get 1 and n key to get 2 exit code");
ConsoleKeyInfo consoleKeyInfo = System.Console.ReadKey();
if (consoleKeyInfo.Key == ConsoleKey.W)
{
Process process = Process.Start("L:/DevOps/Mesa_FI/OI-Metrology/WinForms/bin/Debug/net8.0-windows/win-x64/OI.Metrology.WinForms.exe", "Mike");
process.WaitForExit();
_Logger.LogInformation("ExitCode: <{ExitCode}>", process.ExitCode);
}
else
{
Environment.ExitCode = consoleKeyInfo.Key switch
{
ConsoleKey.Escape => -1,
ConsoleKey.Enter => 0,
ConsoleKey.Y => 1,
ConsoleKey.N => 2,
_ => 9
};
}
}
catch (Exception ex)
{ _Logger.LogError("{Message}{NewLine}{StackTrace}", ex.Message, Environment.NewLine, ex.StackTrace); }
_Logger.LogInformation("Done. Press 'Enter' to end");
_ = System.Console.ReadLine();
_Lifetime.StopApplication();
}
}

3
Console/secrets.json Normal file
View File

@ -0,0 +1,3 @@
{
"Company": "Infineon Technologies Americas Corp."
}

View File

@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.30114.105 VisualStudioVersion = 16.0.30114.105
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Archive", "Archive\OI.Metrology.Archive.csproj", "{D02BA20E-0ACE-4D1C-9132-90773AF3CF5A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\OI.Metrology.Shared.csproj", "{A807EAE3-7DCB-4E5E-BE54-0D7410D18B3E}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Shared", "Shared\OI.Metrology.Shared.csproj", "{A807EAE3-7DCB-4E5E-BE54-0D7410D18B3E}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Server\OI.Metrology.Server.csproj", "{25C86DF8-EC1A-4D4B-AD4E-6561174824B9}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Server", "Server\OI.Metrology.Server.csproj", "{25C86DF8-EC1A-4D4B-AD4E-6561174824B9}"

View File

@ -10,7 +10,7 @@
"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/net7.0/win-x64/OI.Metrology.Server.dll", "program": "${workspaceFolder}/bin/Debug/net8.0/OI.Metrology.Server.dll",
"args": [], "args": [],
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
"stopAtEntry": false, "stopAtEntry": false,

View File

@ -0,0 +1,5 @@
{
"cSpell.words": [
"Infineon"
]
}

View File

@ -13,6 +13,21 @@
], ],
"problemMatcher": "$msCompile" "problemMatcher": "$msCompile"
}, },
{
"label": "Format",
"command": "dotnet",
"type": "process",
"args": [
"format",
"--report",
".vscode",
"--verbosity",
"detailed",
"--severity",
"warn"
],
"problemMatcher": "$msCompile"
},
{ {
"label": "publish", "label": "publish",
"command": "dotnet", "command": "dotnet",

View File

@ -52,4 +52,19 @@ public class InfinityQSV3Controller : Controller, IInfinityQSV3Controller<IActio
return Content(result, "application/json", System.Text.Encoding.UTF8); return Content(result, "application/json", System.Text.Encoding.UTF8);
} }
[HttpGet("epi-pro-temp-verification")]
public IActionResult GetEpiProTempVerification(int[] night)
{
string result = _InfinityQSRepositoryV3.GetEpiProTempVerification(night);
return Content(result, "text/html", System.Text.Encoding.UTF8);
}
[HttpGet("epi-pro-temp-verification-rows")]
public IActionResult GetEpiProTempVerificationRows(int[] night)
{
List<string[]> results = _InfinityQSRepositoryV3.GetEpiProTempVerificationRows(night);
string json = JsonSerializer.Serialize(results);
return Content(json, "application/json", System.Text.Encoding.UTF8);
}
} }

View File

@ -0,0 +1,90 @@
using Microsoft.AspNetCore.Mvc;
namespace OI.Metrology.Server.ApiControllers;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless;
using System.Text.Json;
[Route("api/v4/InfinityQS")]
public class InfinityQSV4Controller : Controller, IInfinityQSV4Controller<IActionResult>
{
private readonly IInfinityQSV4Repository _InfinityQSRepositoryV4;
public InfinityQSV4Controller(IInfinityQSV4Repository InfinityQSRepositoryV4) => _InfinityQSRepositoryV4 = InfinityQSRepositoryV4;
[HttpGet("{sub_group_id}/commandText")]
public IActionResult GetCommandText(string sub_group_id, string process, string job, string part, string lot, string date_time)
{
string commandText = _InfinityQSRepositoryV4.GetCommandText(sub_group_id, process, job, part, lot, date_time);
return Content(commandText, "text/plain; charset=utf-8");
}
[HttpGet("{sub_group_id}/data")]
public IActionResult GetData(string sub_group_id)
{
Result<InfinityQSV4[]> result = _InfinityQSRepositoryV4.GetData(sub_group_id);
string json = JsonSerializer.Serialize(result, ResultInfinityQSV4SourceGenerationContext.Default.ResultInfinityQSV4Array);
return Content(json, "application/json", System.Text.Encoding.UTF8);
}
[HttpGet("{sub_group_id}/descriptors")]
public IActionResult GetDescriptors(string sub_group_id)
{
Result<InfinityQSDescriptorV4[]> result = _InfinityQSRepositoryV4.GetDescriptors(sub_group_id);
string json = JsonSerializer.Serialize(result, ResultInfinityQSDescriptorV4SourceGenerationContext.Default.ResultInfinityQSDescriptorV4Array);
return Content(json, "application/json", System.Text.Encoding.UTF8);
}
[HttpGet("{sub_group_id}/header")]
public IActionResult GetHeader(string sub_group_id)
{
Result<InfinityQSV4[]> result = _InfinityQSRepositoryV4.GetHeader(sub_group_id);
string json = JsonSerializer.Serialize(result, ResultInfinityQSV4SourceGenerationContext.Default.ResultInfinityQSV4Array);
return Content(json, "application/json", System.Text.Encoding.UTF8);
}
[HttpGet("{process}/product-data-average-sum-of-defects-process-mean-process-sigma")]
public IActionResult GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe)
{
string result = _InfinityQSRepositoryV4.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(process, recipe);
return Content(result, "application/json", System.Text.Encoding.UTF8);
}
[HttpGet("epi-pro-temp-verification")]
public IActionResult GetEpiProTempVerification(int[] night)
{
string result = _InfinityQSRepositoryV4.GetEpiProTempVerification(night);
return Content(result, "text/html", System.Text.Encoding.UTF8);
}
[HttpGet("epi-pro-temp-verification-rows")]
public IActionResult GetEpiProTempVerificationRows(int[] night)
{
List<string[]> results = _InfinityQSRepositoryV4.GetEpiProTempVerificationRows(night);
string json = JsonSerializer.Serialize(results);
return Content(json, "application/json", System.Text.Encoding.UTF8);
}
[HttpGet("reactors")]
public IActionResult GetReactors() =>
Json(_InfinityQSRepositoryV4.GetReactors());
[HttpGet("{rds}/run-data-sheet")]
public IActionResult GetRunDataSheet(string rds) =>
Content(_InfinityQSRepositoryV4.GetRunDataSheet(rds));
[HttpGet("{part}/production-specification")]
public IActionResult GetProductionSpecification(string part) =>
Content(_InfinityQSRepositoryV4.GetProductionSpecification(part));
[HttpGet("engineering-spc-review")]
public IActionResult GetEngineeringSpcReview()
{
Dictionary<string, List<string>> results = _InfinityQSRepositoryV4.GetEngineeringSpcReview();
string json = JsonSerializer.Serialize(results);
return Content(json, "application/json", System.Text.Encoding.UTF8);
}
}

View File

@ -40,7 +40,7 @@ public class ToolTypesController : Controller, IToolTypesController<IActionResul
[HttpGet] [HttpGet]
[Route("{id}/headers")] [Route("{id}/headers")]
public IActionResult GetHeaders(int id, [FromQuery] DateTime? datebegin, [FromQuery] DateTime? dateend, [FromQuery] int? page, [FromQuery] int? pagesize, [FromQuery] long? headerid) public IActionResult GetHeaders(int id, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] int? page, [FromQuery] int? pagesize, [FromQuery] long? headerid)
{ {
Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetHeaders(_MetrologyRepo, id, datebegin, dateend, page, pagesize, headerid); Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetHeaders(_MetrologyRepo, id, datebegin, dateend, page, pagesize, headerid);
string json = JsonConvert.SerializeObject(r); string json = JsonConvert.SerializeObject(r);
@ -68,7 +68,7 @@ public class ToolTypesController : Controller, IToolTypesController<IActionResul
[HttpGet] [HttpGet]
[Route("{toolTypeId}/export")] [Route("{toolTypeId}/export")]
public IActionResult GetExportData(int toolTypeId, [FromQuery] DateTime? datebegin, [FromQuery] DateTime? dateend) public IActionResult GetExportData(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend)
{ {
Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetExportData(_MetrologyRepo, toolTypeId, datebegin, dateend); Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetExportData(_MetrologyRepo, toolTypeId, datebegin, dateend);
string json = JsonConvert.SerializeObject(r); string json = JsonConvert.SerializeObject(r);
@ -77,7 +77,7 @@ public class ToolTypesController : Controller, IToolTypesController<IActionResul
[HttpGet] [HttpGet]
[Route("{toolTypeId}/csv")] [Route("{toolTypeId}/csv")]
public IActionResult GetCSVExport(int toolTypeId, [FromQuery] DateTime? datebegin, [FromQuery] DateTime? dateend, [FromQuery] string? filename) public IActionResult GetCSVExport(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] string? filename)
{ {
byte[] r = _ToolTypesRepository.GetCSVExport(_MetrologyRepo, toolTypeId, datebegin, dateend); byte[] r = _ToolTypesRepository.GetCSVExport(_MetrologyRepo, toolTypeId, datebegin, dateend);
return File(r, "application/octet-stream", filename); return File(r, "application/octet-stream", filename);

View File

@ -0,0 +1,22 @@
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));
}

View File

@ -1,20 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.Models.Stateless;
using System.Text.Json;
namespace OI.Metrology.Server.ApiControllers;
[Route("api/[controller]")]
public class WorkMaterialController : Controller, IWorkMaterialController<IActionResult>
{
private readonly IWorkMaterialRepository _WorkMaterialRepository;
public WorkMaterialController(IWorkMaterialRepository WorkMaterialRepository) =>
_WorkMaterialRepository = WorkMaterialRepository;
[HttpGet("{mid}")]
public IActionResult GetCassette(string mid) =>
Json(_WorkMaterialRepository.GetCassette(mid), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}

View File

@ -10,6 +10,7 @@ public class ErrorHandlerController : Controller
public ErrorHandlerController(ILogger<ErrorHandlerController> logger) => _Logger = logger; public ErrorHandlerController(ILogger<ErrorHandlerController> logger) => _Logger = logger;
[ApiExplorerSettings(IgnoreApi = true)]
public IActionResult Index() public IActionResult Index()
{ {
IExceptionHandlerFeature? error = HttpContext.Features.Get<IExceptionHandlerFeature>(); IExceptionHandlerFeature? error = HttpContext.Features.Get<IExceptionHandlerFeature>();

View File

@ -1 +1 @@
{"apiLoggingContentTypes":null,"apiLoggingPathPrefixes":null,"apiLogPath":null,"apiUrl":null,"attachmentPath":null,"buildNumber":"1","company":"Infineon Technologies Americas Corp.","connectionString":null,"gitCommitSeven":"1234567","inboundApiAllowedIPList":null,"isDevelopment":true,"isStaging":false,"mockRoot":null,"monAResource":null,"monASite":null,"oi2SqlConnectionString":null,"oiExportPath":null,"urLs":null,"workingDirectoryName":null} {"apiExportPath":null,"apiLoggingContentTypes":null,"apiLoggingPathPrefixes":null,"apiLogPath":null,"apiUrl":null,"attachmentPath":null,"buildNumber":"1000014","company":"Infineon Technologies Americas Corp.","connectionString":null,"gitCommitSeven":"6bc0487","inboundApiAllowedIPList":null,"isDevelopment":false,"isStaging":false,"mockRoot":null,"monAResource":null,"monASite":null,"oi2SqlConnectionString":null,"tableToPath":null,"urLs":null,"workingDirectoryName":null}

View File

@ -1 +1 @@
1-1234567 1000014-6bc0487

View File

@ -1 +0,0 @@
asdf

View File

@ -1,4 +1,90 @@
{ {
"Results": [], "Results": [
"TotalRows": 0 {
"ID": 0,
"InsertDate": "0001-01-01T00:00:00",
"AttachmentID": "00000000-0000-0000-0000-000000000000",
"Title": null,
"Date": "0001-01-01T00:00:00",
"ToolTypeID": 0,
"ToolTypeName": null,
"MesEntity": "TENCOR2",
"Employee": "PRE",
"Layer": null,
"PSN": "",
"RDS": "",
"Reactor": "",
"Recipe": "8IN.2QUAL",
"Zone": null
},
{
"ID": 0,
"InsertDate": "0001-01-01T00:00:00",
"AttachmentID": "00000000-0000-0000-0000-000000000000",
"Title": null,
"Date": "0001-01-01T00:00:00",
"ToolTypeID": 0,
"ToolTypeName": null,
"MesEntity": "TENCOR3",
"Employee": "",
"Layer": null,
"PSN": "",
"RDS": "",
"Reactor": "",
"Recipe": "8INCLEAN",
"Zone": null
},
{
"ID": 0,
"InsertDate": "0001-01-01T00:00:00",
"AttachmentID": "00000000-0000-0000-0000-000000000000",
"Title": null,
"Date": "0001-01-01T00:00:00",
"ToolTypeID": 0,
"ToolTypeName": null,
"MesEntity": "TENCOR3",
"Employee": "",
"Layer": null,
"PSN": "",
"RDS": "",
"Reactor": "",
"Recipe": "8IN_THIN ROTR",
"Zone": null
},
{
"ID": 0,
"InsertDate": "0001-01-01T00:00:00",
"AttachmentID": "00000000-0000-0000-0000-000000000000",
"Title": null,
"Date": "0001-01-01T00:00:00",
"ToolTypeID": 0,
"ToolTypeName": null,
"MesEntity": "TENCOR3",
"Employee": "",
"Layer": null,
"PSN": "",
"RDS": "",
"Reactor": "",
"Recipe": "8IN_PTYPE_ROTR",
"Zone": null
},
{
"ID": 0,
"InsertDate": "0001-01-01T00:00:00",
"AttachmentID": "00000000-0000-0000-0000-000000000000",
"Title": null,
"Date": "0001-01-01T00:00:00",
"ToolTypeID": 0,
"ToolTypeName": null,
"MesEntity": "TENCOR3",
"Employee": "",
"Layer": null,
"PSN": "",
"RDS": "",
"Reactor": "",
"Recipe": "AS_IFX_ROTR",
"Zone": null
}
],
"TotalRows": 5
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,17 +1,19 @@
{ {
"Results": [ "Results": [
{ {
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357, "SE_SGRP": 1677273357,
"SE_SGTM": 1677273300, "SE_SGTM": 1677273300,
"SE_TSNO": 1, "SE_TSNO": 1,
"TD_TEST": 1650647347,
"PR_NAME": "61", "PR_NAME": "61",
"JD_NAME": "CDE5", "JD_NAME": "CDE5",
"PL_NAME": "575908", "PL_NAME": "575908",
"PD_NAME": "5012", "PD_NAME": "5012",
"TD_TEST": 1650647347,
"TD_NAME": "T", "TD_NAME": "T",
"SE_VAL": 270, "SE_VAL": 270
"EV_COUNT": 0
} }
], ],
"TotalRows": 1 "TotalRows": 1

View File

@ -1,22 +1,35 @@
select iq.ev_count, iq.cl_count, iq.sl_count, iq.se_sgrp, iq.se_sgtm, iq.se_tsno, iq.td_test, iq.pr_name, iq.jd_name, iq.pl_name, iq.pd_name, iq.td_name, iq.se_val
from (
select select
se.f_sgrp se_sgrp, se.f_sgrp se_sgrp,
se.f_sgtm se_sgtm, se.f_sgtm se_sgtm,
se.f_tsno se_tsno, se.f_tsno se_tsno,
se.f_val se_val, se.f_val se_val,
rd.f_name rd_name, pr.f_name pr_name,
jd.f_name jd_name, jd.f_name jd_name,
pl.f_name pl_name, pl.f_name pl_name,
pd.f_name pd_name, pd.f_name pd_name,
td.f_test td_test, td.f_test td_test,
td.f_name td_name, td.f_name td_name,
(select count(cl.f_part)
from [spcepiworld].[dbo].[ctrl_lim] cl
where cl.f_part = pd.f_part
and cl.f_test = td.f_test
) cl_count,
(select count(sl.f_part)
from [spcepiworld].[dbo].[spec_lim] sl
where sl.f_part = pd.f_part
and sl.f_test = td.f_test
) sl_count,
(select count(ev.f_evnt) (select count(ev.f_evnt)
from [spcepiworld].[dbo].[evnt_inf] ev from [spcepiworld].[dbo].[evnt_inf] ev
where ev.f_prcs = rd.f_prcs where ev.f_prcs = pr.f_prcs
and ev.f_part = pd.f_part and ev.f_part = pd.f_part
and ev.f_sgtm = se.f_sgtm) ev_count and ev.f_sgtm = se.f_sgtm
) ev_count
from [spcepiworld].[dbo].[sgrp_ext] se from [spcepiworld].[dbo].[sgrp_ext] se
join [spcepiworld].[dbo].[prcs_dat] rd join [spcepiworld].[dbo].[prcs_dat] pr
on se.f_prcs = rd.f_prcs on se.f_prcs = pr.f_prcs
join [spcepiworld].[dbo].[job_dat] jd join [spcepiworld].[dbo].[job_dat] jd
on se.f_job = jd.f_job on se.f_job = jd.f_job
join [spcepiworld].[dbo].[part_lot] pl join [spcepiworld].[dbo].[part_lot] pl
@ -27,9 +40,11 @@
on se.f_test = td.f_test on se.f_test = td.f_test
where se.f_flag = 0 where se.f_flag = 0
and se.f_sgrp = 1677273357 and se.f_sgrp = 1677273357
and rd.f_name = '61' and pr.f_name = '61'
and pd.f_name = '5012' and pd.f_name = '5012'
and jd.f_name = 'CDE5' and jd.f_name = 'CDE5'
and pl.f_name = '575908' and pl.f_name = '575908'
and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '2023-02-24 15:15:00' and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '2023-02-24 15:15:00'
) as iq
order by iq.ev_count desc, iq.cl_count desc, iq.sl_count desc, iq.se_sgrp, iq.se_tsno, iq.td_test
for json path for json path

File diff suppressed because it is too large Load Diff

View File

@ -1,17 +1,19 @@
{ {
"Results": [ "Results": [
{ {
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357, "SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300, "SubGroupDateTime": 1677273300,
"SiteNumber": 1, "SiteNumber": 1,
"VariableNumber": 1650647347,
"Process": "61", "Process": "61",
"Job": "CDE5", "Job": "CDE5",
"Lot": "575908", "Lot": "575908",
"Part": "5012", "Part": "5012",
"VariableNumber": 1650647347,
"Variable": "T", "Variable": "T",
"Value": 270, "Value": 270
"EventCount": 0
} }
], ],
"TotalRows": 1 "TotalRows": 1

View File

@ -0,0 +1,78 @@
select case when iq.sl_loos is null then 0 else iq.sl_loos end +
case when iq.sl_uoos is null then 0 else iq.sl_uoos end +
iq.ev_count as iq_sum,
iq.sl_aflag,
iq.sl_loos,
iq.sl_uoos,
iq.se_sgrp,
iq.se_sgtm,
iq.se_tsno,
iq.td_test,
iq.pr_name,
iq.jd_name,
iq.pl_name,
iq.pd_name,
iq.td_name,
iq.se_val,
iq.sl_eflag,
iq.sl_scal,
iq.sl_sls,
iq.sl_usl
from (
select
se.f_sgrp se_sgrp,
se.f_sgtm se_sgtm,
se.f_tsno se_tsno,
se.f_val se_val,
pr.f_name pr_name,
jd.f_name jd_name,
pl.f_name pl_name,
pd.f_name pd_name,
td.f_test td_test,
td.f_name td_name,
sl.f_eflag sl_eflag,
sl.f_aflag sl_aflag,
sl.f_scal sl_scal,
sl.f_lsl sl_sls,
sl.f_usl sl_usl,
case when sl.f_aflag is null or sl.f_aflag = 0 then null else
case when round(se.f_val, sl.F_scal, 1) < sl.f_lsl then 1 else 0 end
end as sl_loos,
case when sl.f_aflag is null or sl.f_aflag = 0 then null else
case when round(se.f_val, sl.F_scal, 1) > sl.f_usl then 1 else 0 end
end as sl_uoos,
(select count(ev.f_evnt)
from [spcepiworld].[dbo].[evnt_inf] ev
where ev.f_prcs = pr.f_prcs
and ev.f_part = pd.f_part
and ev.f_sgtm = se.f_sgtm
) ev_count
from [spcepiworld].[dbo].[sgrp_ext] se
join [spcepiworld].[dbo].[prcs_dat] pr
on se.f_prcs = pr.f_prcs
join [spcepiworld].[dbo].[job_dat] jd
on se.f_job = jd.f_job
join [spcepiworld].[dbo].[part_lot] pl
on se.f_lot = pl.f_lot
join [spcepiworld].[dbo].[part_dat] pd
on se.f_part = pd.f_part
join [spcepiworld].[dbo].[test_dat] td
on se.f_test = td.f_test
left join [spcepiworld].[dbo].[spec_lim] sl
on se.f_part = sl.f_part
and se.f_test = sl.f_test
where se.f_flag = 0
and (sl.f_prcs is null or se.f_prcs = sl.f_prcs or sl.f_prcs = 0)
and se.f_sgrp = 1698497987
and pr.f_name = '61'
and pd.f_name = '5012'
and jd.f_name = 'CDE5'
and pl.f_name = '575908'
and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '2023-02-24 15:15:00'
) as iq
order by iq.sl_loos + iq.sl_uoos + iq.ev_count desc,
iq.sl_aflag desc,
iq.se_sgrp,
iq.se_tsno,
iq.td_test
for json path

View File

@ -0,0 +1 @@
<tr><td>44</td><td class='Productive'>Productive</td><td class='LoadedRDSCount1'>616747</td><td>0</td><td>0</td><td>1/1/0001 12:00:00 AM</td></tr><tr><td>50</td><td class='Productive'>Productive</td><td class='LoadedRDSCount0'></td><td>0</td><td>0</td><td>1/1/0001 12:00:00 AM</td></tr><tr><td>48</td><td class='Unscheduled Down'>Unscheduled Down</td><td class='LoadedRDSCount0'></td><td>0</td><td>0</td><td>1/1/0001 12:00:00 AM</td></tr><tr><td>42</td><td class='Scheduled Down'>Scheduled Down</td><td class='LoadedRDSCount1'>616741</td><td>0</td><td>0</td><td>1/1/0001 12:00:00 AM</td></tr><tr><td>40</td><td class='Unscheduled Down'>Unscheduled Down</td><td class='LoadedRDSCount1'>616740</td><td>0</td><td>0</td><td>1/1/0001 12:00:00 AM</td></tr><tr><td>46</td><td class='Productive'>Productive</td><td class='LoadedRDSCount0'></td><td>0</td><td>0</td><td>1/1/0001 12:00:00 AM</td></tr><tr><td>54</td><td class='Non-Scheduled'>Non-Scheduled</td><td class='LoadedRDSCount0'></td><td>0</td><td>0</td><td>1/1/0001 12:00:00 AM</td></tr>

View File

@ -0,0 +1,70 @@
[
[
"40",
"Unscheduled Down",
"617354",
"1090",
"-3.25",
"11/7/2023 9:53:35 AM",
"168",
"\u0026nbsp;",
"44",
"Productive",
"617355",
"1040",
"-1.75",
"11/14/2023 5:25:07 AM",
"4"
],
[
"42",
"Productive",
"\u0026nbsp;",
"1070",
"2.5",
"11/12/2023 10:38:41 AM",
"47",
"\u0026nbsp;",
"46",
"Productive",
"\u0026nbsp;",
"1069",
"5",
"11/14/2023 5:38:02 AM",
"4"
],
[
"48",
"Productive",
"\u0026nbsp;",
"1075",
"-10.75",
"11/11/2023 6:54:58 AM",
"75",
"\u0026nbsp;",
"54",
"Non-Scheduled",
"\u0026nbsp;",
"1067",
"-5",
"8/17/2023 4:12:20 AM",
"2142"
],
[
"50",
"Productive",
"\u0026nbsp;",
"1078",
"-11",
"11/12/2023 6:47:21 AM",
"51",
"\u0026nbsp;",
"\u0026nbsp;",
"\u0026nbsp;",
"\u0026nbsp;",
"\u0026nbsp;",
"\u0026nbsp;",
"\u0026nbsp;",
"\u0026nbsp;"
]
]

View File

@ -1 +1 @@
[{"RDS":"615071","AttachmentId":"EF1EA71C-E04B-4214-997B-CF07D05D044A","Slot":"*02","SumOfDefects":"17","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.133"},{"RDS":"615071","AttachmentId":"A9CBA5F8-0690-4B73-9AD5-3DE545CE6C80","Slot":"*03","SumOfDefects":"36","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.137"},{"RDS":"615071","AttachmentId":"542485EE-5F84-4F33-895F-1F3239E97E4A","Slot":"*05","SumOfDefects":"19","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.140"},{"RDS":"615071","AttachmentId":"A28C8618-6BDB-43C9-97F5-2440EAD32425","Slot":"*06","SumOfDefects":"35","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.140"},{"RDS":"615071","AttachmentId":"09D11F28-34E2-4B8B-8A19-C87285FDB210","Slot":"*07","SumOfDefects":"11","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.140"},{"RDS":"615071","AttachmentId":"596E73A4-1955-4BC1-AD96-549D2E604699","Slot":"*08","SumOfDefects":"16","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.147"},{"RDS":"615071","AttachmentId":"17C0783F-A5B4-4121-8D5B-7E2E20E81DFD","Slot":"*09","SumOfDefects":"35","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.230"},{"RDS":"615071","AttachmentId":"BDEF4C5F-537D-48AB-B696-77D0A5FCF592","Slot":"*10","SumOfDefects":"28","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.247"},{"RDS":"615071","AttachmentId":"AA0BDFA9-10FC-44F6-B21B-AC2DFB0A5F33","Slot":"*12","SumOfDefects":"43","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.250"},{"RDS":"615071","AttachmentId":"434E49DF-2BF8-4793-864C-76F5C561B3DD","Slot":"*13","SumOfDefects":"23","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.250"},{"RDS":"615071","AttachmentId":"F5FAA898-1C28-48AF-A25F-749F8F658E61","Slot":"*14","SumOfDefects":"34","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.257"},{"RDS":"615071","AttachmentId":"F37E2A95-9189-4832-9793-3CDF9F525EB0","Slot":"*15","SumOfDefects":"50","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.257"},{"RDS":"615071","AttachmentId":"AE6B3D7C-C4BF-4067-9199-FF3BC44DA153","Slot":"*16","SumOfDefects":"53","Sort":"PASS","InsertDate":"2023-10-30T19:00:20.257"},{"RDS":"615071","AttachmentId":"1679140B-42A5-445F-AE70-CE559C32254E","Slot":"*18","SumOfDefects":"907","Sort":"FAIL","InsertDate":"2023-10-30T19:00:20.260"},{"RDS":"615071","AttachmentId":"43CA162D-A04B-4A37-90D7-83BABAF2D3AB","Slot":"*01","SumOfDefects":"100","Sort":"FAIL","InsertDate":"2023-10-30T18:48:57.617"},{"RDS":"615071","AttachmentId":"706C7D0E-4EC1-4042-9DAA-3D141532B6E1","Slot":"*04","SumOfDefects":"12","Sort":"PASS","InsertDate":"2023-10-30T18:48:57.623"},{"RDS":"615071","AttachmentId":"4CECFAC9-745E-4235-BAD9-BE57D1FB450E","Slot":"*11","SumOfDefects":"22","Sort":"PASS","InsertDate":"2023-10-30T18:48:57.627"},{"RDS":"615071","AttachmentId":"B62DE99D-2060-4627-A006-C5FA0DC779BE","Slot":"*17","SumOfDefects":"279","Sort":"FAIL","InsertDate":"2023-10-30T18:48:57.630"}] [{"RDS":"615071","AttachmentId":"43CA162D-A04B-4A37-90D7-83BABAF2D3AB","Slot":"*01","SumOfDefects":"100","Sort":"FAIL","InsertDate":"2023-10-30T18:48:57.617"},{"RDS":"615071","AttachmentId":"706C7D0E-4EC1-4042-9DAA-3D141532B6E1","Slot":"*04","SumOfDefects":"12","Sort":"PASS","InsertDate":"2023-10-30T18:48:57.623"},{"RDS":"615071","AttachmentId":"4CECFAC9-745E-4235-BAD9-BE57D1FB450E","Slot":"*11","SumOfDefects":"22","Sort":"PASS","InsertDate":"2023-10-30T18:48:57.627"},{"RDS":"615071","AttachmentId":"B62DE99D-2060-4627-A006-C5FA0DC779BE","Slot":"*17","SumOfDefects":"279","Sort":"FAIL","InsertDate":"2023-10-30T18:48:57.630"}]

View File

@ -1,23 +1 @@
{ {"Results":[{"InsertDate":null,"Run Header":null,"Title":null,"AttachmentID":null,"Position":"Average","Thickness":"NaN","ID":-1},{"InsertDate":null,"Run Header":null,"Title":null,"AttachmentID":null,"Position":"Std Dev","Thickness":"NaN","ID":-2}],"TotalRows":2}
"Results": [
{
"InsertDate": null,
"Run Header": null,
"Title": null,
"AttachmentID": null,
"Position": "Average",
"Thickness": "NaN",
"ID": -1
},
{
"InsertDate": null,
"Run Header": null,
"Title": null,
"AttachmentID": null,
"Position": "Std Dev",
"Thickness": "NaN",
"ID": -2
}
],
"TotalRows": 2
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@
"DataTableName": "BioRadRunData", "DataTableName": "BioRadRunData",
"ExportSPName": "Export_BioRad", "ExportSPName": "Export_BioRad",
"HeaderGridAttributes": null, "HeaderGridAttributes": null,
"DataGridAttributes": null, "DataGridAttributes": "{ \u0022pinButton\u0022: true }",
"DataGridSortBy": "LEN(Position), Position", "DataGridSortBy": "LEN(Position), Position",
"DataGridStatsColumn": "Thickness", "DataGridStatsColumn": "Thickness",
"DataGridStatsStdDevType": " ", "DataGridStatsStdDevType": " ",
@ -224,7 +224,7 @@
"ApiName": "SentToMetrology", "ApiName": "SentToMetrology",
"ColumnName": "SentToMetrology", "ColumnName": "SentToMetrology",
"DisplayTitle": "SentToOI", "DisplayTitle": "SentToOI",
"GridDisplayOrder": 9, "GridDisplayOrder": 10,
"GridAttributes": "{ \u0022dataType:\u0022: \u0022bool\u0022, \u0022formatter\u0022: \u0022boolToYesNo\u0022 }", "GridAttributes": "{ \u0022dataType:\u0022: \u0022bool\u0022, \u0022formatter\u0022: \u0022boolToYesNo\u0022 }",
"TableDisplayOrder": 14 "TableDisplayOrder": 14
}, },
@ -274,7 +274,7 @@
"ApiName": "Wafer", "ApiName": "Wafer",
"ColumnName": "Wafer", "ColumnName": "Wafer",
"DisplayTitle": "Wafer", "DisplayTitle": "Wafer",
"GridDisplayOrder": 0, "GridDisplayOrder": 9,
"GridAttributes": null, "GridAttributes": null,
"TableDisplayOrder": 9 "TableDisplayOrder": 9
}, },

View File

@ -23,7 +23,11 @@
{ {
"ToolTypeName": "TencorSP1", "ToolTypeName": "TencorSP1",
"ID": 6 "ID": 6
},
{
"ToolTypeName": "SRP",
"ID": 7
} }
], ],
"TotalRows": 6 "TotalRows": 7
} }

View File

@ -1,280 +0,0 @@
{
"Results": [
{
"RunDataSheet": "586337",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 1,
"Pocket": "1",
"Zone": "1"
},
{
"RunDataSheet": "586337",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 2,
"Pocket": "2",
"Zone": "1"
},
{
"RunDataSheet": "586337",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 3,
"Pocket": "3",
"Zone": "1"
},
{
"RunDataSheet": "586337",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 4,
"Pocket": "4",
"Zone": "1"
},
{
"RunDataSheet": "586337",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 5,
"Pocket": "5",
"Zone": "1"
},
{
"RunDataSheet": "586337",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 6,
"Pocket": "6",
"Zone": "1"
},
{
"RunDataSheet": "586337",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 7,
"Pocket": "7",
"Zone": "1"
},
{
"RunDataSheet": "586337",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 8,
"Pocket": "8",
"Zone": "1"
},
{
"RunDataSheet": "586345",
"Reactor": 52,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 9,
"Pocket": "1",
"Zone": "1"
},
{
"RunDataSheet": "586345",
"Reactor": 52,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 10,
"Pocket": "2",
"Zone": "1"
},
{
"RunDataSheet": "586345",
"Reactor": 52,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 11,
"Pocket": "3",
"Zone": "1"
},
{
"RunDataSheet": "586345",
"Reactor": 52,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 12,
"Pocket": "4",
"Zone": "1"
},
{
"RunDataSheet": "586345",
"Reactor": 52,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 13,
"Pocket": "5",
"Zone": "1"
},
{
"RunDataSheet": "586345",
"Reactor": 52,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 14,
"Pocket": "6",
"Zone": "1"
},
{
"RunDataSheet": "586345",
"Reactor": 52,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 15,
"Pocket": "7",
"Zone": "1"
},
{
"RunDataSheet": "586345",
"Reactor": 52,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 16,
"Pocket": "8",
"Zone": "1"
},
{
"RunDataSheet": "586347",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 17,
"Pocket": "1",
"Zone": "1"
},
{
"RunDataSheet": "586347",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 18,
"Pocket": "2",
"Zone": "1"
},
{
"RunDataSheet": "586347",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 19,
"Pocket": "3",
"Zone": "1"
},
{
"RunDataSheet": "586347",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 20,
"Pocket": "4",
"Zone": "1"
},
{
"RunDataSheet": "586347",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 21,
"Pocket": "5",
"Zone": "1"
},
{
"RunDataSheet": "586347",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 22,
"Pocket": "6",
"Zone": "1"
},
{
"RunDataSheet": "586347",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 23,
"Pocket": "7",
"Zone": "1"
},
{
"RunDataSheet": "586347",
"Reactor": 54,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 24,
"Pocket": "8",
"Zone": "1"
},
{
"RunDataSheet": "586381",
"Reactor": 52,
"PSN": "4445",
"RecipeName": "Phosphorus",
"RecipeNumber": 743,
"SpecType": "Production",
"SlotNumber": 25,
"Pocket": "1",
"Zone": "1"
}
],
"TotalRows": 25
}

View File

@ -13,14 +13,21 @@ public record AppSettings(string ApiExportPath,
string ConnectionString, string ConnectionString,
string GitCommitSeven, string GitCommitSeven,
string InboundApiAllowedIPList, string InboundApiAllowedIPList,
string IqsColumns,
string IqsFile,
string IqsKey,
string IqsRed,
string IqsYellow,
bool IsDevelopment, bool IsDevelopment,
bool IsStaging, bool IsStaging,
string MockRoot, string MockRoot,
string MonAResource, string MonAResource,
string MonASite, string MonASite,
string OI2SqlConnectionString, string OpenInsightApplicationProgrammingInterface,
Dictionary<string, string> TableToPath, Dictionary<string, string> TableToPath,
string URLs, string URLs,
string WaferCounterDestinationDirectory,
string WaferCounterRootDirectory,
string WorkingDirectoryName) string WorkingDirectoryName)
{ {

View File

@ -17,14 +17,21 @@ public class AppSettings
public string? ConnectionString { get; set; } public string? ConnectionString { get; set; }
public string? GitCommitSeven { get; set; } public string? GitCommitSeven { get; set; }
public string? InboundApiAllowedIPList { get; set; } public string? InboundApiAllowedIPList { get; set; }
public string? IqsColumns { get; set; }
public string? IqsFile { get; set; }
public string? IqsKey { get; set; }
public string? IqsRed { get; set; }
public string? IqsYellow { get; set; }
public bool? IsDevelopment { get; set; } public bool? IsDevelopment { get; set; }
public bool? IsStaging { get; set; } public bool? IsStaging { get; set; }
public string? MockRoot { get; set; } public string? MockRoot { get; set; }
public string? MonAResource { get; set; } public string? MonAResource { get; set; }
public string? MonASite { get; set; } public string? MonASite { get; set; }
public string? Oi2SqlConnectionString { get; set; } public string? OpenInsightApplicationProgrammingInterface { get; set; }
public Dictionary<string, string>? TableToPath { get; set; } public Dictionary<string, string>? TableToPath { get; set; }
public string? URLs { get; set; } public string? URLs { get; set; }
public string? WaferCounterDestinationDirectory { get; set; }
public string? WaferCounterRootDirectory { get; set; }
public string? WorkingDirectoryName { get; set; } public string? WorkingDirectoryName { get; set; }
public override string ToString() public override string ToString()
@ -48,14 +55,21 @@ public class AppSettings
if (appSettings.ConnectionString is null) throw new NullReferenceException(nameof(ConnectionString)); if (appSettings.ConnectionString is null) throw new NullReferenceException(nameof(ConnectionString));
if (appSettings.GitCommitSeven is null) throw new NullReferenceException(nameof(GitCommitSeven)); if (appSettings.GitCommitSeven is null) throw new NullReferenceException(nameof(GitCommitSeven));
if (appSettings.InboundApiAllowedIPList is null) throw new NullReferenceException(nameof(InboundApiAllowedIPList)); if (appSettings.InboundApiAllowedIPList is null) throw new NullReferenceException(nameof(InboundApiAllowedIPList));
if (appSettings.IqsColumns is null) throw new NullReferenceException(nameof(IqsColumns));
if (appSettings.IqsFile is null) throw new NullReferenceException(nameof(IqsFile));
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.IsDevelopment is null) throw new NullReferenceException(nameof(IsDevelopment));
if (appSettings.IsStaging is null) throw new NullReferenceException(nameof(IsStaging)); if (appSettings.IsStaging is null) throw new NullReferenceException(nameof(IsStaging));
if (appSettings.MockRoot is null) throw new NullReferenceException(nameof(MockRoot)); if (appSettings.MockRoot is null) throw new NullReferenceException(nameof(MockRoot));
if (appSettings.MonAResource is null) throw new NullReferenceException(nameof(MonAResource)); if (appSettings.MonAResource is null) throw new NullReferenceException(nameof(MonAResource));
if (appSettings.MonASite is null) throw new NullReferenceException(nameof(MonASite)); if (appSettings.MonASite is null) throw new NullReferenceException(nameof(MonASite));
if (appSettings.Oi2SqlConnectionString is null) throw new NullReferenceException(nameof(Oi2SqlConnectionString)); if (appSettings.OpenInsightApplicationProgrammingInterface is null) throw new NullReferenceException(nameof(OpenInsightApplicationProgrammingInterface));
if (appSettings.URLs is null) throw new NullReferenceException(nameof(URLs)); if (appSettings.URLs is null) throw new NullReferenceException(nameof(URLs));
if (appSettings.TableToPath is null) throw new NullReferenceException(nameof(TableToPath)); if (appSettings.TableToPath is null) throw new NullReferenceException(nameof(TableToPath));
if (appSettings.WaferCounterDestinationDirectory is null) throw new NullReferenceException(nameof(WaferCounterDestinationDirectory));
if (appSettings.WaferCounterRootDirectory is null) throw new NullReferenceException(nameof(WaferCounterRootDirectory));
if (appSettings.WorkingDirectoryName is null) throw new NullReferenceException(nameof(WorkingDirectoryName)); if (appSettings.WorkingDirectoryName is null) throw new NullReferenceException(nameof(WorkingDirectoryName));
result = new( result = new(
appSettings.ApiExportPath, appSettings.ApiExportPath,
@ -69,14 +83,21 @@ public class AppSettings
appSettings.ConnectionString, appSettings.ConnectionString,
appSettings.GitCommitSeven, appSettings.GitCommitSeven,
appSettings.InboundApiAllowedIPList, appSettings.InboundApiAllowedIPList,
appSettings.IqsColumns,
appSettings.IqsFile,
appSettings.IqsKey,
appSettings.IqsRed,
appSettings.IqsYellow,
appSettings.IsDevelopment.Value, appSettings.IsDevelopment.Value,
appSettings.IsStaging.Value, appSettings.IsStaging.Value,
appSettings.MockRoot, appSettings.MockRoot,
appSettings.MonAResource, appSettings.MonAResource,
appSettings.MonASite, appSettings.MonASite,
appSettings.Oi2SqlConnectionString, appSettings.OpenInsightApplicationProgrammingInterface,
appSettings.TableToPath, appSettings.TableToPath,
appSettings.URLs, appSettings.URLs,
appSettings.WaferCounterDestinationDirectory,
appSettings.WaferCounterRootDirectory,
appSettings.WorkingDirectoryName); appSettings.WorkingDirectoryName);
return result; return result;
} }
@ -89,17 +110,19 @@ public class AppSettings
#pragma warning restore IL3050, IL2026 #pragma warning restore IL3050, IL2026
if (appSettings?.ApiExportPath is null) if (appSettings?.ApiExportPath is null)
{ {
List<string> paths = new();
foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers) foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers)
{ {
if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider) if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider)
continue; continue;
if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider) if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider)
continue; continue;
paths.Add(physicalFileProvider.Root);
if (!physicalFileProvider.Root.Contains("UserSecrets")) if (!physicalFileProvider.Root.Contains("UserSecrets"))
continue; continue;
throw new NotSupportedException(physicalFileProvider.Root); throw new NotSupportedException(physicalFileProvider.Root);
} }
throw new NotSupportedException("Not found!"); throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths)}");
} }
result = Get(appSettings); result = Get(appSettings);
return result; return result;

View File

@ -10,8 +10,8 @@
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<UserSecretsId>b0a3891c-b775-422c-80ee-63a2f385045d</UserSecretsId> <UserSecretsId>b0a3891c-b775-422c-80ee-63a2f385045d</UserSecretsId>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -24,22 +24,22 @@
<Content Remove="compilerconfig.json" /> <Content Remove="compilerconfig.json" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.1.15" /> <PackageReference Include="Dapper" Version="2.1.24" />
<PackageReference Include="EntityFramework" Version="6.4.4" /> <PackageReference Include="EntityFramework" Version="6.4.4" />
<PackageReference Include="jQuery" Version="3.7.1" /> <PackageReference Include="jQuery" Version="3.7.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="7.0.13" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.1" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" /> <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="7.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.0" />
<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.5.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" /> <PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" /> <PackageReference Include="System.Drawing.Common" Version="8.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" /> <ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" />
@ -104,6 +104,12 @@
<None Include="Data\Tests\InfinityQSV3-GetDescriptors.json"> <None Include="Data\Tests\InfinityQSV3-GetDescriptors.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<None Include="Data\Tests\InfinityQSV3-GetEpiProTempVerification.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV3-GetEpiProTempVerificationRows.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV3-GetHeader.json"> <None Include="Data\Tests\InfinityQSV3-GetHeader.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
@ -140,8 +146,5 @@
<None Include="Data\Tests\ToolTypes-Index.json"> <None Include="Data\Tests\ToolTypes-Index.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None> </None>
<None Include="Data\Tests\WorkMaterial-GetCassette.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -62,26 +62,27 @@ public class Program
SQLDbConnectionFactory sqlDbConnectionFactory = new(appSettings); SQLDbConnectionFactory sqlDbConnectionFactory = new(appSettings);
ClientSettingsRepository clientSettingsRepository = new(appSettings); ClientSettingsRepository clientSettingsRepository = new(appSettings);
_ = webApplicationBuilder.Services.AddHttpClient();
_ = webApplicationBuilder.Services.AddSingleton(_ => appSettings); _ = webApplicationBuilder.Services.AddSingleton(_ => appSettings);
_ = webApplicationBuilder.Services.AddSingleton<IInboundRepository, InboundRepository>(); _ = webApplicationBuilder.Services.AddSingleton<IPinRepository, PinRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IReactorsRepository, ReactorsRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IClientSettingsRepository>(_ => clientSettingsRepository);
_ = webApplicationBuilder.Services.AddSingleton<IServiceShopOrderRepository, ServiceShopOrderRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IPinRepository, PinRepository>(_ => new(appSettings.MockRoot));
_ = webApplicationBuilder.Services.AddSingleton<IDbConnectionFactory, SQLDbConnectionFactory>(_ => sqlDbConnectionFactory);
_ = webApplicationBuilder.Services.AddSingleton<IToolTypesRepository, ToolTypesRepository>(_ => new(appSettings.MockRoot));
_ = webApplicationBuilder.Services.AddSingleton<ISpreadingResistanceProfileService, SpreadingResistanceProfileService>();
_ = webApplicationBuilder.Services.AddSingleton<IAppSettingsRepository<Models.Binder.AppSettings>>(_ => appSettingsRepository);
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSRepository, InfinityQSRepository>(_ => new(appSettings.MockRoot, sqlDbConnectionFactory));
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV2Repository, InfinityQSV2Repository>(_ => new(appSettings.MockRoot, sqlDbConnectionFactory));
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV3Repository, InfinityQSV3Repository>(_ => new(appSettings.MockRoot, sqlDbConnectionFactory));
_ = webApplicationBuilder.Services.AddSingleton<IWorkMaterialRepository, WorkMaterialRepository>(_ => new(appSettings.MockRoot, sqlDbConnectionFactory));
_ = webApplicationBuilder.Services.AddScoped<IExportRepository, ExportRepository>(); _ = webApplicationBuilder.Services.AddScoped<IExportRepository, ExportRepository>();
_ = webApplicationBuilder.Services.AddScoped<IAttachmentsService, AttachmentsService>(); _ = webApplicationBuilder.Services.AddScoped<IAttachmentsService, AttachmentsService>();
_ = webApplicationBuilder.Services.AddScoped<IInboundDataService, InboundDataService>(); _ = webApplicationBuilder.Services.AddScoped<IInboundDataService, InboundDataService>();
_ = webApplicationBuilder.Services.AddSingleton<IInboundRepository, InboundRepository>();
_ = webApplicationBuilder.Services.AddScoped<IMetrologyRepository, MetrologyRepository>(); _ = webApplicationBuilder.Services.AddScoped<IMetrologyRepository, MetrologyRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IReactorsRepository, ReactorsRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IToolTypesRepository, ToolTypesRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSRepository, InfinityQSRepository>();
_ = webApplicationBuilder.Services.AddScoped<IOpenInsightV1Repository, OpenInsightV1Repository>(); _ = webApplicationBuilder.Services.AddScoped<IOpenInsightV1Repository, OpenInsightV1Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV2Repository, InfinityQSV2Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV3Repository, InfinityQSV3Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV4Repository, InfinityQSV4Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IWaferCounterRepository, WaferCounterRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IClientSettingsRepository>(_ => clientSettingsRepository);
_ = webApplicationBuilder.Services.AddSingleton<IServiceShopOrderRepository, ServiceShopOrderRepository>();
_ = webApplicationBuilder.Services.AddSingleton<ISpreadingResistanceProfileService, SpreadingResistanceProfileService>();
_ = webApplicationBuilder.Services.AddSingleton<IDbConnectionFactory, SQLDbConnectionFactory>(_ => sqlDbConnectionFactory);
_ = webApplicationBuilder.Services.AddSingleton<IAppSettingsRepository<Models.Binder.AppSettings>>(_ => appSettingsRepository);
_ = webApplicationBuilder.Services.AddSwaggerGen(); _ = webApplicationBuilder.Services.AddSwaggerGen();
_ = webApplicationBuilder.Services.AddSession(sessionOptions => _ = webApplicationBuilder.Services.AddSession(sessionOptions =>

View File

@ -35,19 +35,13 @@ public class AppSettingsRepository : IAppSettingsRepository<Models.Binder.AppSet
{ {
if (string.IsNullOrEmpty(_AppSettings.ConnectionString)) if (string.IsNullOrEmpty(_AppSettings.ConnectionString))
throw new NotSupportedException(); throw new NotSupportedException();
if (string.IsNullOrEmpty(_AppSettings.OI2SqlConnectionString))
throw new NotSupportedException();
#if DEBUG #if DEBUG
if (!_AppSettings.ConnectionString.Contains("test", StringComparison.CurrentCultureIgnoreCase)) if (!_AppSettings.ConnectionString.Contains("test", StringComparison.CurrentCultureIgnoreCase))
throw new NotSupportedException(); throw new NotSupportedException();
if (!_AppSettings.OI2SqlConnectionString.Contains("test", StringComparison.CurrentCultureIgnoreCase))
throw new NotSupportedException();
#endif #endif
#if !DEBUG #if !DEBUG
if (_AppSettings.ConnectionString.Contains("test", StringComparison.CurrentCultureIgnoreCase)) if (_AppSettings.ConnectionString.Contains("test", StringComparison.CurrentCultureIgnoreCase))
throw new NotSupportedException(); throw new NotSupportedException();
if (_AppSettings.OI2SqlConnectionString.Contains("test", StringComparison.CurrentCultureIgnoreCase))
throw new NotSupportedException();
#endif #endif
} }

View File

@ -13,11 +13,7 @@ public class ClientSettingsRepository : IClientSettingsRepository
internal List<string> GetClientSettings(IPAddress? remoteIpAddress) internal List<string> GetClientSettings(IPAddress? remoteIpAddress)
{ {
List<string> results = new(); List<string> results = new() { remoteIpAddress is null ? nameof(remoteIpAddress) : remoteIpAddress.ToString() };
if (remoteIpAddress is null)
results.Add(nameof(remoteIpAddress));
else
results.Add(remoteIpAddress.ToString());
if (!_AppSettings.IsDevelopment) if (!_AppSettings.IsDevelopment)
throw new Exception("Shouldn't expose!"); throw new Exception("Shouldn't expose!");
return results; return results;

View File

@ -1,3 +1,4 @@
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories; using OI.Metrology.Shared.Repositories;
@ -15,9 +16,9 @@ public class InfinityQSRepository : IInfinityQSRepository
private readonly string _RepositoryName; private readonly string _RepositoryName;
private readonly IDbConnectionFactory _DBConnectionFactory; private readonly IDbConnectionFactory _DBConnectionFactory;
public InfinityQSRepository(string mockRoot, IDbConnectionFactory dbConnectionFactory) public InfinityQSRepository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory)
{ {
_MockRoot = mockRoot; _MockRoot = appSettings.MockRoot;
_DBConnectionFactory = dbConnectionFactory; _DBConnectionFactory = dbConnectionFactory;
_RepositoryName = nameof(InfinityQSRepository)[..^10]; _RepositoryName = nameof(InfinityQSRepository)[..^10];
} }

View File

@ -1,3 +1,4 @@
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories; using OI.Metrology.Shared.Repositories;
@ -15,9 +16,9 @@ public class InfinityQSV2Repository : IInfinityQSV2Repository
private readonly string _RepositoryName; private readonly string _RepositoryName;
private readonly IDbConnectionFactory _DBConnectionFactory; private readonly IDbConnectionFactory _DBConnectionFactory;
public InfinityQSV2Repository(string mockRoot, IDbConnectionFactory dbConnectionFactory) public InfinityQSV2Repository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory)
{ {
_MockRoot = mockRoot; _MockRoot = appSettings.MockRoot;
_DBConnectionFactory = dbConnectionFactory; _DBConnectionFactory = dbConnectionFactory;
_RepositoryName = nameof(InfinityQSV2Repository)[..^10]; _RepositoryName = nameof(InfinityQSV2Repository)[..^10];
} }

View File

@ -1,6 +1,9 @@
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.Stateless; using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories; using OI.Metrology.Shared.Repositories;
using System.Collections.ObjectModel;
using System.Data; using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Text; using System.Text;
@ -13,17 +16,21 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository
private readonly string _MockRoot; private readonly string _MockRoot;
private readonly string _RepositoryName; private readonly string _RepositoryName;
private readonly IHttpClientFactory _HttpClientFactory;
private readonly IDbConnectionFactory _DBConnectionFactory; private readonly IDbConnectionFactory _DBConnectionFactory;
private readonly string _OpenInsightApplicationProgrammingInterface;
public InfinityQSV3Repository(string mockRoot, IDbConnectionFactory dbConnectionFactory) public InfinityQSV3Repository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory, IHttpClientFactory httpClientFactory)
{ {
_MockRoot = mockRoot; _MockRoot = appSettings.MockRoot;
_HttpClientFactory = httpClientFactory;
_DBConnectionFactory = dbConnectionFactory; _DBConnectionFactory = dbConnectionFactory;
_RepositoryName = nameof(InfinityQSV3Repository)[..^10]; _RepositoryName = nameof(InfinityQSV3Repository)[..^10];
_OpenInsightApplicationProgrammingInterface = appSettings.OpenInsightApplicationProgrammingInterface;
} }
string IInfinityQSV3Repository.GetCommandText(string subGroupId) string IInfinityQSV3Repository.GetCommandText(string subGroupId)
{ { // cSpell:disable
StringBuilder result = new(); StringBuilder result = new();
if (string.IsNullOrEmpty(subGroupId)) if (string.IsNullOrEmpty(subGroupId))
throw new ArgumentException(null, nameof(subGroupId)); throw new ArgumentException(null, nameof(subGroupId));
@ -43,10 +50,10 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository
_ = result.Append(" where sd.f_sgrp = ").Append(subGroupId).AppendLine(" "); _ = result.Append(" where sd.f_sgrp = ").Append(subGroupId).AppendLine(" ");
_ = result.AppendLine(" for json path "); _ = result.AppendLine(" for json path ");
return result.ToString(); return result.ToString();
} } // cSpell:enable
string IInfinityQSV3Repository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime) string IInfinityQSV3Repository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime)
{ { // cSpell:disable
StringBuilder result = new(); StringBuilder result = new();
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)
@ -137,7 +144,7 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository
.AppendLine(" iq.td_test ") .AppendLine(" iq.td_test ")
.AppendLine(" for json path "); .AppendLine(" for json path ");
return result.ToString(); return result.ToString();
} } // cSpell:enable
private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText) private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText)
{ {
@ -219,7 +226,7 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository
} }
string IInfinityQSV3Repository.GetCommandText(InfinityQSV3 infinityQSV3) string IInfinityQSV3Repository.GetCommandText(InfinityQSV3 infinityQSV3)
{ { // cSpell:disable
StringBuilder result = new(); StringBuilder result = new();
if (string.IsNullOrEmpty(infinityQSV3.Process)) if (string.IsNullOrEmpty(infinityQSV3.Process))
throw new ArgumentException(nameof(infinityQSV3.Process)); throw new ArgumentException(nameof(infinityQSV3.Process));
@ -247,7 +254,7 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository
.Append(" and ev.f_sgtm = ").Append(infinityQSV3.SubGroupDateTime).AppendLine(" ") .Append(" and ev.f_sgtm = ").Append(infinityQSV3.SubGroupDateTime).AppendLine(" ")
.AppendLine(" for json path "); .AppendLine(" for json path ");
return result.ToString(); return result.ToString();
} } // cSpell:enable
Result<InfinityQSV3[]> IInfinityQSV3Repository.GetHeader(string subGroupId) Result<InfinityQSV3[]> IInfinityQSV3Repository.GetHeader(string subGroupId)
{ {
@ -274,7 +281,7 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository
} }
string IInfinityQSV3Repository.GetCommandText(string process, string? part) string IInfinityQSV3Repository.GetCommandText(string process, string? part)
{ { // cSpell:disable
StringBuilder result = new(); StringBuilder result = new();
if (string.IsNullOrEmpty(process)) if (string.IsNullOrEmpty(process))
throw new ArgumentException(null, nameof(process)); throw new ArgumentException(null, nameof(process));
@ -297,7 +304,7 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository
.Append(" and part.f_name = '").Append(part).AppendLine("' ") .Append(" and part.f_name = '").Append(part).AppendLine("' ")
.AppendLine(" for json path; "); .AppendLine(" for json path; ");
return result.ToString(); return result.ToString();
} } // cSpell:enable
string IInfinityQSV3Repository.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe) string IInfinityQSV3Repository.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe)
{ {
@ -318,4 +325,241 @@ public class InfinityQSV3Repository : IInfinityQSV3Repository
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 || reactor.ReactType != reactTypeFilter)
continue;
results.Add(reactor.ReactorNo, reactor);
}
return new(results);
}
string IInfinityQSV3Repository.GetCommandText(List<string> eppReactorNumbers)
{ // cSpell:disable
StringBuilder result = new();
_ = result
.AppendLine(" select se.f_sgrp, ")
.AppendLine(" dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgrp), '19700101'))) date_time, ")
.AppendLine(" iq.pr_name, ")
.AppendLine(" iq.pd_name, ")
.AppendLine(" max(case ")
.AppendLine(" when td.f_test = 1104769646 ")
.AppendLine(" then se.f_val ")
.AppendLine(" else null ")
.AppendLine(" end) as iq_value, ")
.AppendLine(" max(case ")
.AppendLine(" when td.f_test = 1312288843 ")
.AppendLine(" then se.f_val else null ")
.AppendLine(" end) as iq_temp_offset_percent ")
.AppendLine(" from ( ")
.AppendLine(" select ")
.AppendLine(" max(se.f_sgrp) se_max_sgrp, ")
.AppendLine(" se.f_test se_test, ")
.AppendLine(" pr.f_name pr_name, ")
.AppendLine(" pd.f_name pd_name ")
.AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ")
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ")
.AppendLine(" on se.f_prcs = pr.f_prcs ")
.AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ")
.AppendLine(" on se.f_part = pd.f_part ")
.AppendLine(" where se.f_flag = 0 ")
.Append(" and pr.f_name in (").Append(string.Join(',', eppReactorNumbers)).AppendLine(") ")
.AppendLine(" and pd.f_name = '1090 - Full Load' ")
.AppendLine(" and se.f_test in (1104769646, 1312288843) ")
.AppendLine(" group by se.f_test, ")
.AppendLine(" pr.f_name, ")
.AppendLine(" pd.f_name ")
.AppendLine(" ) as iq ")
.AppendLine(" join [spcepiworld].[dbo].[sgrp_ext] se ")
.AppendLine(" on iq.se_max_sgrp = se.f_sgrp ")
.AppendLine(" join [spcepiworld].[dbo].[test_dat] td ")
.AppendLine(" on iq.se_test = td.f_test ")
.AppendLine(" and se.f_test = td.f_test ")
.AppendLine(" where se.f_flag = 0 ")
.AppendLine(" and td.f_test in (1104769646, 1312288843) ")
.AppendLine(" group by se.f_sgrp, ")
.AppendLine(" iq.pr_name, ")
.AppendLine(" iq.pd_name ")
.AppendLine(" order by iq.pr_name ")
.AppendLine(" for json path; ");
return result.ToString();
} // 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[]> IInfinityQSV3Repository.GetEpiProTempVerificationRows(int[] night)
{
List<string[]>? results;
List<string> eppReactorNumbers = new();
List<string> nightSiftReactors = Convert(night);
ReadOnlyDictionary<int, Reactor> eppReactors = GetReactorsMatchingType("EPP");
foreach (KeyValuePair<int, Reactor> keyValuePair in eppReactors)
eppReactorNumbers.Add($"'{keyValuePair.Key}'");
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV3Repository.GetEpiProTempVerificationRows)}.json"));
results = JsonSerializer.Deserialize<List<string[]>>(json);
if (results is null)
throw new NullReferenceException(nameof(results));
}
else
{
bool found;
results = new();
int loadedCount;
Reactor? reactor;
string loadedRDS;
int reactorNumber;
TimeSpan timeSpan;
List<string> columns;
List<int> used = new();
List<int> dayShiftOrder = new();
long ticks = DateTime.Now.Ticks;
List<int> nightShiftOrder = new();
InfinityQS1090FullLoad infinityQS1090FullLoad;
IInfinityQSV3Repository infinityQSV3Repository = this;
string commandText = infinityQSV3Repository.GetCommandText(eppReactorNumbers);
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText);
InfinityQS1090FullLoad[]? infinityQS1090FullLoads = stringBuilder.Length == 0 ? Array.Empty<InfinityQS1090FullLoad>() : JsonSerializer.Deserialize(stringBuilder.ToString(), InfinityQS1090FullLoadArraySourceGenerationContext.Default.InfinityQS1090FullLoadArray);
if (infinityQS1090FullLoads is null)
throw new NullReferenceException(nameof(infinityQS1090FullLoads));
for (int i = 0; i < infinityQS1090FullLoads.Length; i++)
{
infinityQS1090FullLoad = infinityQS1090FullLoads[i];
if (infinityQS1090FullLoad.Reactor is null)
continue;
if (!int.TryParse(infinityQS1090FullLoad.Reactor, out reactorNumber))
continue;
if (!eppReactors.TryGetValue(reactorNumber, out reactor))
continue;
if (!nightSiftReactors.Contains(infinityQS1090FullLoad.Reactor))
dayShiftOrder.Add(i);
else
nightShiftOrder.Add(i);
}
for (int i = 0; i < infinityQS1090FullLoads.Length; i++)
{
if (used.Contains(i) || !dayShiftOrder.Contains(i))
continue;
infinityQS1090FullLoad = infinityQS1090FullLoads[i];
if (infinityQS1090FullLoad.Reactor is null)
continue;
if (!int.TryParse(infinityQS1090FullLoad.Reactor, out reactorNumber))
continue;
if (!eppReactors.TryGetValue(reactorNumber, out reactor))
continue;
used.Add(i);
found = false;
timeSpan = new(ticks - infinityQS1090FullLoad.SubGroupIdFormatted.Ticks);
loadedCount = reactor.LoadedRDS is null ? 0 : reactor.LoadedRDS.Count;
loadedRDS = reactor.LoadedRDS is null ? "&nbsp;" : reactor.LoadedRDS[0].ToString();
results.Add(new string[]{
reactor.ReactorNo.ToString(),
reactor.E10State,
loadedRDS,
infinityQS1090FullLoad.Value.ToString(),
infinityQS1090FullLoad.TemperatureOffsetPercentage.ToString(),
infinityQS1090FullLoad.SubGroupIdFormatted.ToString(),
Math.Floor(timeSpan.TotalHours).ToString()
});
for (int j = i + 1; j < infinityQS1090FullLoads.Length; j++)
{
if (used.Contains(j) || !nightShiftOrder.Contains(j))
continue;
infinityQS1090FullLoad = infinityQS1090FullLoads[j];
if (infinityQS1090FullLoad.Reactor is null)
continue;
if (!int.TryParse(infinityQS1090FullLoad.Reactor, out reactorNumber))
continue;
if (!eppReactors.TryGetValue(reactorNumber, out reactor))
continue;
used.Add(j);
found = true;
timeSpan = new(ticks - infinityQS1090FullLoad.SubGroupIdFormatted.Ticks);
loadedCount = reactor.LoadedRDS is null ? 0 : reactor.LoadedRDS.Count;
loadedRDS = reactor.LoadedRDS is null ? "&nbsp;" : reactor.LoadedRDS[0].ToString();
columns = new();
columns.AddRange(results[^1]);
columns.AddRange(new string[]
{
"&nbsp;",
reactor.ReactorNo.ToString(),
reactor.E10State,
loadedRDS,
infinityQS1090FullLoad.Value.ToString(),
infinityQS1090FullLoad.TemperatureOffsetPercentage.ToString(),
infinityQS1090FullLoad.SubGroupIdFormatted.ToString(),
Math.Floor(timeSpan.TotalHours).ToString()
});
results[^1] = columns.ToArray();
break;
}
if (!found)
{
columns = new();
columns.AddRange(results[^1]);
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
results[^1] = columns.ToArray();
}
}
}
return results;
}
string IInfinityQSV3Repository.GetEpiProTempVerification(int[] night)
{
StringBuilder result = new();
IInfinityQSV3Repository infinityQSV3Repository = this;
List<string[]> collection = infinityQSV3Repository.GetEpiProTempVerificationRows(night);
foreach (string[] row in collection)
{
_ = result.Append("<tr>");
foreach (string column in row)
_ = result.Append("<td>").Append(column).Append("</td>");
_ = result.Append("</tr>");
}
return result.ToString();
}
} }

View File

@ -0,0 +1,783 @@
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.Collections.ObjectModel;
using System.Data;
using System.Data.Common;
using System.Reflection;
using System.Text;
using System.Text.Json;
namespace OI.Metrology.Server.Repository;
public class InfinityQSV4Repository : IInfinityQSV4Repository
{
private record Record(string? Color, string Text);
private readonly string _MockRoot;
private readonly string _RepositoryName;
private readonly AppSettings _AppSettings;
private readonly IHttpClientFactory _HttpClientFactory;
private readonly IDbConnectionFactory _DBConnectionFactory;
private readonly string _OpenInsightApplicationProgrammingInterface;
public InfinityQSV4Repository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory, IHttpClientFactory httpClientFactory)
{
_AppSettings = appSettings;
_MockRoot = appSettings.MockRoot;
_HttpClientFactory = httpClientFactory;
_DBConnectionFactory = dbConnectionFactory;
_RepositoryName = nameof(InfinityQSV4Repository)[..^10];
_OpenInsightApplicationProgrammingInterface = appSettings.OpenInsightApplicationProgrammingInterface;
}
string IInfinityQSV4Repository.GetCommandText(string subGroupId)
{ // cSpell:disable
StringBuilder result = new();
if (string.IsNullOrEmpty(subGroupId))
throw new ArgumentException(null, nameof(subGroupId));
_ = result
.AppendLine(" select ")
.AppendLine(" sd.f_sgrp sd_sgrp, ")
.AppendLine(" sd.f_tsno sd_tsno, ")
.AppendLine(" dd.f_dsgp dd_dsgp, ")
.AppendLine(" dg.f_name gd_name, ")
.AppendLine(" dd.f_name dd_name ")
.AppendLine(" from [SPCEPIWORLD].[dbo].[SGRP_DSC] sd ")
.AppendLine(" join [SPCEPIWORLD].[dbo].[DESC_DAT] dd ")
.AppendLine(" on sd.f_dsgp = dd.f_dsgp ")
.AppendLine(" and sd.f_desc = dd.f_desc ")
.AppendLine(" join [SPCEPIWORLD].[dbo].[DESC_GRP] dg ")
.AppendLine(" on dd.f_dsgp = dg.f_dsgp ");
_ = result.Append(" where sd.f_sgrp = ").Append(subGroupId).AppendLine(" ");
_ = result.AppendLine(" for json path ");
return result.ToString();
} // cSpell:enable
string IInfinityQSV4Repository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime)
{ // cSpell:disable
StringBuilder result = new();
const string dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')) && dateTime.Length != dateTimeFormat.Length)
throw new ArgumentException(null, nameof(dateTime));
_ = result
.AppendLine(" select case when iq.sl_loos is null then 0 else iq.sl_loos end + ")
.AppendLine(" case when iq.sl_uoos is null then 0 else iq.sl_uoos end + ")
.AppendLine(" iq.ev_count as iq_sum, ")
.AppendLine(" iq.sl_aflag, ")
.AppendLine(" iq.sl_loos, ")
.AppendLine(" iq.sl_uoos, ")
.AppendLine(" iq.se_sgrp, ")
.AppendLine(" iq.se_sgtm, ")
.AppendLine(" iq.se_tsno, ")
.AppendLine(" iq.td_test, ")
.AppendLine(" iq.pr_name, ")
.AppendLine(" iq.jd_name, ")
.AppendLine(" iq.pl_name, ")
.AppendLine(" iq.pd_name, ")
.AppendLine(" iq.td_name, ")
.AppendLine(" iq.se_val, ")
.AppendLine(" iq.sl_eflag, ")
.AppendLine(" iq.sl_scal, ")
.AppendLine(" iq.sl_sls, ")
.AppendLine(" iq.sl_usl ")
.AppendLine(" from ( ")
.AppendLine(" select ")
.AppendLine(" se.f_sgrp se_sgrp, ")
.AppendLine(" se.f_sgtm se_sgtm, ")
.AppendLine(" se.f_tsno se_tsno, ")
.AppendLine(" se.f_val se_val, ")
.AppendLine(" pr.f_name pr_name, ")
.AppendLine(" jd.f_name jd_name, ")
.AppendLine(" pl.f_name pl_name, ")
.AppendLine(" pd.f_name pd_name, ")
.AppendLine(" td.f_test td_test, ")
.AppendLine(" td.f_name td_name, ")
.AppendLine(" sl.f_eflag sl_eflag, ")
.AppendLine(" sl.f_aflag sl_aflag, ")
.AppendLine(" sl.f_scal sl_scal, ")
.AppendLine(" sl.f_lsl sl_sls, ")
.AppendLine(" sl.f_usl sl_usl, ")
.AppendLine(" case when sl.f_aflag is null or sl.f_aflag = 0 then null else ")
.AppendLine(" case when round(se.f_val, sl.F_scal, 1) < sl.f_lsl then 1 else 0 end ")
.AppendLine(" end as sl_loos, ")
.AppendLine(" case when sl.f_aflag is null or sl.f_aflag = 0 then null else ")
.AppendLine(" case when round(se.f_val, sl.F_scal, 1) > sl.f_usl then 1 else 0 end ")
.AppendLine(" end as sl_uoos, ")
.AppendLine(" (select count(ev.f_evnt) ")
.AppendLine(" from [spcepiworld].[dbo].[evnt_inf] ev ")
.AppendLine(" where ev.f_prcs = pr.f_prcs ")
.AppendLine(" and ev.f_part = pd.f_part ")
.AppendLine(" and ev.f_sgtm = se.f_sgtm ")
.AppendLine(" ) ev_count ")
.AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ")
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ")
.AppendLine(" on se.f_prcs = pr.f_prcs ")
.AppendLine(" join [spcepiworld].[dbo].[job_dat] jd ")
.AppendLine(" on se.f_job = jd.f_job ")
.AppendLine(" join [spcepiworld].[dbo].[part_lot] pl ")
.AppendLine(" on se.f_lot = pl.f_lot ")
.AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ")
.AppendLine(" on se.f_part = pd.f_part ")
.AppendLine(" join [spcepiworld].[dbo].[test_dat] td ")
.AppendLine(" on se.f_test = td.f_test ")
.AppendLine(" left join [spcepiworld].[dbo].[spec_lim] sl ")
.AppendLine(" on se.f_part = sl.f_part ")
.AppendLine(" and se.f_test = sl.f_test ")
.AppendLine(" where se.f_flag = 0 ")
.AppendLine(" and (sl.f_prcs is null or se.f_prcs = sl.f_prcs or sl.f_prcs = 0) ");
if (!string.IsNullOrEmpty(subGroupId))
_ = result.Append(" and se.f_sgrp = ").Append(subGroupId.Split(" ")[0]).AppendLine(" ");
if (!string.IsNullOrEmpty(process))
_ = result.Append(" and pr.f_name = '").Append(process).AppendLine("' ");
if (!string.IsNullOrEmpty(part))
_ = result.Append(" and pd.f_name = '").Append(part).AppendLine("' ");
if (!string.IsNullOrEmpty(job))
_ = result.Append(" and jd.f_name = '").Append(job).AppendLine("' ");
if (!string.IsNullOrEmpty(lot))
_ = result.Append(" and pl.f_name = '").Append(lot).AppendLine("' ");
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("' ");
_ = result.AppendLine(" ) as iq ")
.AppendLine(" order by iq.sl_loos + iq.sl_uoos + iq.ev_count desc, ")
.AppendLine(" iq.sl_aflag desc, ")
.AppendLine(" iq.se_sgrp, ")
.AppendLine(" iq.se_tsno, ")
.AppendLine(" iq.td_test ")
.AppendLine(" for json path ");
return result.ToString();
} // cSpell:enable
private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText, bool useIqsConnection)
{
StringBuilder stringBuilder = new();
using DbConnection dbConnection = dbConnectionFactory.GetDbConnection(useIqsConnection);
DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = commandText;
DbDataReader dbDataReader = dbCommand.ExecuteReader(CommandBehavior.SequentialAccess);
while (dbDataReader.Read())
_ = stringBuilder.Append(dbDataReader.GetString(0));
return stringBuilder;
}
private static InfinityQSV4 GetInfinityQSV4(IDbConnectionFactory dbConnectionFactory, IInfinityQSV4Repository infinityQSV4Repository, string subGroupId)
{
InfinityQSV4 result;
string commandText = infinityQSV4Repository.GetCommandText(subGroupId, process: string.Empty, job: string.Empty, part: string.Empty, lot: string.Empty, dateTime: string.Empty);
StringBuilder stringBuilder = GetForJsonPath(dbConnectionFactory, commandText, useIqsConnection: false);
InfinityQSV4[]? results = stringBuilder.Length == 0 ? Array.Empty<InfinityQSV4>() : JsonSerializer.Deserialize(stringBuilder.ToString(), ResultInfinityQSV4SourceGenerationContext.Default.InfinityQSV4Array); // , new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
if (results is null)
throw new NullReferenceException(nameof(results));
result = results.First();
return result;
}
Result<InfinityQSV4[]> IInfinityQSV4Repository.GetData(string subGroupId)
{
Result<InfinityQSV4[]>? result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetData)}.json"));
result = JsonSerializer.Deserialize(json, ResultInfinityQSV4SourceGenerationContext.Default.ResultInfinityQSV4Array);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
IInfinityQSV4Repository infinityQSV4Repository = this;
InfinityQSV4 infinityQSV4 = GetInfinityQSV4(_DBConnectionFactory, infinityQSV4Repository, subGroupId);
GetOI(infinityQSV4);
string commandText = infinityQSV4Repository.GetCommandText(subGroupId, process: infinityQSV4.Process, job: infinityQSV4.Job, part: infinityQSV4.Part, lot: infinityQSV4.Lot, dateTime: string.Concat(infinityQSV4.SubGroupDateTime));
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText, useIqsConnection: false);
InfinityQSV4[]? results = stringBuilder.Length == 0 ? Array.Empty<InfinityQSV4>() : JsonSerializer.Deserialize(stringBuilder.ToString(), ResultInfinityQSV4SourceGenerationContext.Default.InfinityQSV4Array); // , new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
if (results is null)
throw new NullReferenceException(nameof(results));
result = new()
{
Results = results,
TotalRows = results.Length,
};
}
return result;
}
Result<InfinityQSDescriptorV4[]> IInfinityQSV4Repository.GetDescriptors(string subGroupId)
{
Result<InfinityQSDescriptorV4[]>? result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetDescriptors)}.json"));
result = JsonSerializer.Deserialize(json, ResultInfinityQSDescriptorV4SourceGenerationContext.Default.ResultInfinityQSDescriptorV4Array);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
IInfinityQSV4Repository infinityQSV4Repository = this;
string commandText = infinityQSV4Repository.GetCommandText(subGroupId);
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText, useIqsConnection: false);
InfinityQSDescriptorV4[]? results = stringBuilder.Length == 0 ? Array.Empty<InfinityQSDescriptorV4>() : JsonSerializer.Deserialize(stringBuilder.ToString(), ResultInfinityQSDescriptorV4SourceGenerationContext.Default.InfinityQSDescriptorV4Array); // , new JsonSerializerOptions { PropertyNameCaseInsensitive = true }
if (results is null)
throw new NullReferenceException(nameof(results));
result = new()
{
Results = results,
TotalRows = results.Length,
};
}
return result;
}
string IInfinityQSV4Repository.GetCommandText(InfinityQSV4 infinityQSV4)
{ // cSpell:disable
StringBuilder result = new();
if (string.IsNullOrEmpty(infinityQSV4.Process))
throw new ArgumentException(nameof(infinityQSV4.Process));
if (string.IsNullOrEmpty(infinityQSV4.Part))
throw new ArgumentException(nameof(infinityQSV4.Part));
_ = result
.AppendLine(" select ")
.AppendLine(" ev.f_evnt [ev_evnt], ")
.AppendLine(" ev.f_sgtm [ev_sgtm], ")
.AppendLine(" dateadd(HH, -7, (dateadd(SS, convert(bigint, ev.f_sgtm), '19700101'))) [ev_utc7], ")
.AppendLine(" pr.f_name [pr_name], ")
.AppendLine(" pd.f_name [pd_name], ")
.AppendLine(" td.f_test [td_test], ")
.AppendLine(" td.f_name [td_name], ")
.AppendLine(" ev.f_name [ev_name] ")
.AppendLine(" from [spcepiworld].[dbo].[evnt_inf] ev ")
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ")
.AppendLine(" on ev.f_prcs = pr.f_prcs ")
.AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ")
.AppendLine(" on ev.f_part = pd.f_part ")
.AppendLine(" join [spcepiworld].[dbo].[test_dat] td ")
.AppendLine(" on ev.f_test = td.f_test ")
.Append(" where pr.f_name = '").Append(infinityQSV4.Process).AppendLine("' ")
.Append(" and pd.f_name = '").Append(infinityQSV4.Part).AppendLine("' ")
.Append(" and ev.f_sgtm = ").Append(infinityQSV4.SubGroupDateTime).AppendLine(" ")
.AppendLine(" for json path ");
return result.ToString();
} // cSpell:enable
Result<InfinityQSV4[]> IInfinityQSV4Repository.GetHeader(string subGroupId)
{
Result<InfinityQSV4[]>? result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetHeader)}.json"));
result = JsonSerializer.Deserialize(json, ResultInfinityQSV4SourceGenerationContext.Default.ResultInfinityQSV4Array);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
IInfinityQSV4Repository infinityQSV4Repository = this;
InfinityQSV4 infinityQSV4 = GetInfinityQSV4(_DBConnectionFactory, infinityQSV4Repository, subGroupId);
InfinityQSV4[] results = new InfinityQSV4[] { infinityQSV4 };
result = new()
{
Results = results,
TotalRows = results.Length,
};
}
return result;
}
string IInfinityQSV4Repository.GetCommandText(string process, string? part)
{ // cSpell:disable
StringBuilder result = new();
if (string.IsNullOrEmpty(process))
throw new ArgumentException(null, nameof(process));
if (string.IsNullOrEmpty(part))
throw new ArgumentException(null, nameof(part));
_ = result
.AppendLine(" select [f_mean] as ProcessMean, ")
.AppendLine(" [f_sp] as ProcessSigma ")
.AppendLine(" from [spcepiworld].[dbo].[test_dat] test ")
.AppendLine(" join [spcepiworld].[dbo].[ctrl_lim] ctrl ")
.AppendLine(" on test.f_test = ctrl.f_test ")
.AppendLine(" and test.f_tsgp = 1104848523 /* Product Data */ ")
.AppendLine(" join [spcepiworld].[dbo].[part_dat] part ")
.AppendLine(" on part.f_part = ctrl.f_part ")
.AppendLine(" and ctrl.f_test = 1125073605 /* Average Sum of Defects */ ")
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] process ")
.AppendLine(" on process.f_prcs = ctrl.f_prcs ")
.AppendLine(" where test.f_name = 'Average Sum of Defects' ")
.Append(" and process.f_name = '").Append(process).AppendLine("' ")
.Append(" and part.f_name = '").Append(part).AppendLine("' ")
.AppendLine(" for json path; ");
return result.ToString();
} // cSpell:enable
string IInfinityQSV4Repository.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe)
{
StringBuilder result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma)}.json"));
result = new(json);
}
else
{
IInfinityQSV4Repository infinityQSV4Repository = this;
string commandText = infinityQSV4Repository.GetCommandText(process, recipe);
result = GetForJsonPath(_DBConnectionFactory, commandText, useIqsConnection: false);
if (result.Length == 0)
result = new("{}");
}
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)
{ // cSpell:disable
StringBuilder result = new();
_ = result
.AppendLine(" select se.f_sgrp, ")
.AppendLine(" dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgrp), '19700101'))) date_time, ")
.AppendLine(" iq.pr_name, ")
.AppendLine(" iq.pd_name, ")
.AppendLine(" max(case ")
.AppendLine(" when td.f_test = 1104769646 ")
.AppendLine(" then se.f_val ")
.AppendLine(" else null ")
.AppendLine(" end) as iq_value, ")
.AppendLine(" max(case ")
.AppendLine(" when td.f_test = 1312288843 ")
.AppendLine(" then se.f_val else null ")
.AppendLine(" end) as iq_temp_offset_percent ")
.AppendLine(" from ( ")
.AppendLine(" select ")
.AppendLine(" max(se.f_sgrp) se_max_sgrp, ")
.AppendLine(" se.f_test se_test, ")
.AppendLine(" pr.f_name pr_name, ")
.AppendLine(" pd.f_name pd_name ")
.AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ")
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ")
.AppendLine(" on se.f_prcs = pr.f_prcs ")
.AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ")
.AppendLine(" on se.f_part = pd.f_part ")
.AppendLine(" where se.f_flag = 0 ")
.Append(" and pr.f_name in (").Append(string.Join(',', eppReactorNumbers)).AppendLine(") ")
.AppendLine(" and pd.f_name = '1090 - Full Load' ")
.AppendLine(" and se.f_test in (1104769646, 1312288843) ")
.AppendLine(" group by se.f_test, ")
.AppendLine(" pr.f_name, ")
.AppendLine(" pd.f_name ")
.AppendLine(" ) as iq ")
.AppendLine(" join [spcepiworld].[dbo].[sgrp_ext] se ")
.AppendLine(" on iq.se_max_sgrp = se.f_sgrp ")
.AppendLine(" join [spcepiworld].[dbo].[test_dat] td ")
.AppendLine(" on iq.se_test = td.f_test ")
.AppendLine(" and se.f_test = td.f_test ")
.AppendLine(" where se.f_flag = 0 ")
.AppendLine(" and td.f_test in (1104769646, 1312288843) ")
.AppendLine(" group by se.f_sgrp, ")
.AppendLine(" iq.pr_name, ")
.AppendLine(" iq.pd_name ")
.AppendLine(" order by iq.pr_name ")
.AppendLine(" for json path; ");
return result.ToString();
} // 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[]>? results;
List<string> eppReactorNumbers = new();
List<string> nightSiftReactors = Convert(night);
ReadOnlyDictionary<int, Reactor> eppReactors = GetReactorsMatchingType("EPP");
foreach (KeyValuePair<int, Reactor> keyValuePair in eppReactors)
eppReactorNumbers.Add($"'{keyValuePair.Key}'");
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetEpiProTempVerificationRows)}.json"));
results = JsonSerializer.Deserialize<List<string[]>>(json);
if (results is null)
throw new NullReferenceException(nameof(results));
}
else
{
bool found;
results = new();
int loadedCount;
Reactor? reactor;
string loadedRDS;
int reactorNumber;
TimeSpan timeSpan;
List<string> columns;
List<int> used = new();
List<int> dayShiftOrder = new();
long ticks = DateTime.Now.Ticks;
List<int> nightShiftOrder = new();
InfinityQS1090FullLoad infinityQS1090FullLoad;
IInfinityQSV4Repository infinityQSV4Repository = this;
string commandText = infinityQSV4Repository.GetCommandText(eppReactorNumbers);
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText, useIqsConnection: false);
InfinityQS1090FullLoad[]? infinityQS1090FullLoads = stringBuilder.Length == 0 ? Array.Empty<InfinityQS1090FullLoad>() : JsonSerializer.Deserialize(stringBuilder.ToString(), InfinityQS1090FullLoadArraySourceGenerationContext.Default.InfinityQS1090FullLoadArray);
if (infinityQS1090FullLoads is null)
throw new NullReferenceException(nameof(infinityQS1090FullLoads));
for (int i = 0; i < infinityQS1090FullLoads.Length; i++)
{
infinityQS1090FullLoad = infinityQS1090FullLoads[i];
if (infinityQS1090FullLoad.Reactor is null)
continue;
if (!int.TryParse(infinityQS1090FullLoad.Reactor, out reactorNumber))
continue;
if (!eppReactors.TryGetValue(reactorNumber, out reactor))
continue;
if (!nightSiftReactors.Contains(infinityQS1090FullLoad.Reactor))
dayShiftOrder.Add(i);
else
nightShiftOrder.Add(i);
}
for (int i = 0; i < infinityQS1090FullLoads.Length; i++)
{
if (used.Contains(i) || !dayShiftOrder.Contains(i))
continue;
infinityQS1090FullLoad = infinityQS1090FullLoads[i];
if (infinityQS1090FullLoad.Reactor is null)
continue;
if (!int.TryParse(infinityQS1090FullLoad.Reactor, out reactorNumber))
continue;
if (!eppReactors.TryGetValue(reactorNumber, out reactor))
continue;
used.Add(i);
found = false;
timeSpan = new(ticks - infinityQS1090FullLoad.SubGroupIdFormatted.Ticks);
loadedCount = reactor.LoadedRDS is null ? 0 : reactor.LoadedRDS.Count;
loadedRDS = reactor.LoadedRDS is null ? "&nbsp;" : reactor.LoadedRDS[0].ToString();
results.Add(new string[]{
reactor.ReactorNo.ToString(),
reactor.E10State,
loadedRDS,
infinityQS1090FullLoad.Value.ToString(),
infinityQS1090FullLoad.TemperatureOffsetPercentage.ToString(),
infinityQS1090FullLoad.SubGroupIdFormatted.ToString(),
Math.Floor(timeSpan.TotalHours).ToString()
});
for (int j = i + 1; j < infinityQS1090FullLoads.Length; j++)
{
if (used.Contains(j) || !nightShiftOrder.Contains(j))
continue;
infinityQS1090FullLoad = infinityQS1090FullLoads[j];
if (infinityQS1090FullLoad.Reactor is null)
continue;
if (!int.TryParse(infinityQS1090FullLoad.Reactor, out reactorNumber))
continue;
if (!eppReactors.TryGetValue(reactorNumber, out reactor))
continue;
used.Add(j);
found = true;
timeSpan = new(ticks - infinityQS1090FullLoad.SubGroupIdFormatted.Ticks);
loadedCount = reactor.LoadedRDS is null ? 0 : reactor.LoadedRDS.Count;
loadedRDS = reactor.LoadedRDS is null ? "&nbsp;" : reactor.LoadedRDS[0].ToString();
columns = new();
columns.AddRange(results[^1]);
columns.AddRange(new string[]
{
"&nbsp;",
reactor.ReactorNo.ToString(),
reactor.E10State,
loadedRDS,
infinityQS1090FullLoad.Value.ToString(),
infinityQS1090FullLoad.TemperatureOffsetPercentage.ToString(),
infinityQS1090FullLoad.SubGroupIdFormatted.ToString(),
Math.Floor(timeSpan.TotalHours).ToString()
});
results[^1] = columns.ToArray();
break;
}
if (!found)
{
columns = new();
columns.AddRange(results[^1]);
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
columns.Add("&nbsp;");
results[^1] = columns.ToArray();
}
}
}
return results;
}
string IInfinityQSV4Repository.GetEpiProTempVerification(int[] night)
{
StringBuilder result = new();
IInfinityQSV4Repository infinityQSV4Repository = this;
List<string[]> collection = infinityQSV4Repository.GetEpiProTempVerificationRows(night);
foreach (string[] row in collection)
{
_ = result.Append("<tr>");
foreach (string column in row)
_ = result.Append("<td>").Append(column).Append("</td>");
_ = result.Append("</tr>");
}
return result.ToString();
}
List<Reactor> IInfinityQSV4Repository.GetReactors()
{
List<Reactor> results = new();
ReadOnlyDictionary<int, Reactor> keyValuePairs = GetReactorsMatchingType(reactTypeFilter: null);
foreach (KeyValuePair<int, Reactor> keyValuePair in keyValuePairs)
results.Add(keyValuePair.Value);
return results;
}
string IInfinityQSV4Repository.GetRunDataSheet(string rds)
{
string result;
HttpClient httpClient = _HttpClientFactory.CreateClient();
Task<string> task = httpClient.GetStringAsync($"{_OpenInsightApplicationProgrammingInterface}/materials/rds/{rds}");
task.Wait();
result = task.Result;
if (rds == "123456")
{
RunDataSheetRoot? runDataSheetRoot = JsonSerializer.Deserialize(result, RunDataSheetRootSourceGenerationContext.Default.RunDataSheetRoot);
if (runDataSheetRoot is not null)
{
List<string> lines = new();
foreach (char ch in runDataSheetRoot.RunDataSheet.PSN)
{ }
result = string.Join(Environment.NewLine, lines);
}
}
return result;
}
string IInfinityQSV4Repository.GetProductionSpecification(string part)
{
string result;
HttpClient httpClient = _HttpClientFactory.CreateClient();
Task<string> task = httpClient.GetStringAsync($"{_OpenInsightApplicationProgrammingInterface}/materials/prod_spec/{part}");
task.Wait();
result = task.Result;
if (part == "4992")
{
ProdSpecRoot? prodSpecRoot = JsonSerializer.Deserialize(result, ProdSpecRootSourceGenerationContext.Default.ProdSpecRoot);
if (prodSpecRoot is not null)
{
List<string> lines = new();
foreach (PrsStage prsStage in prodSpecRoot.ProdSpec.PrsStages)
{
if (prsStage.QaMetTests is null)
continue;
foreach (QaMetTest qaMetTest in prsStage.QaMetTests)
{
lines.Add(qaMetTest.Test);
// lines.Add(qaMetTest.Slots);
lines.Add(qaMetTest.Recipe);
lines.Add(qaMetTest.RecipePattern);
if (qaMetTest.Test != "THICK_ONLY")
continue;
lines.Add(qaMetTest.Min.ToString());
lines.Add(qaMetTest.Max.ToString());
}
}
result = string.Join(Environment.NewLine, lines);
}
}
return result;
}
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);
ProdSpecRoot? prodSpec = JsonSerializer.Deserialize(json, ProdSpecRootSourceGenerationContext.Default.ProdSpecRoot);
if (prodSpec is null)
{
if (prodSpec is null)
{ }
}
}
private static Record? GetValue(AppSettings appSettings, string line)
{
Record? 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 file)
{
Record? record;
List<Record> results = new();
List<string> checkColumns = new();
string[] lines = File.ReadAllLines(file);
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 static void FileFindReplaceAndSave(AppSettings appSettings, string iqsFile, FileInfo fileInfo)
{
string lines = File.ReadAllText(iqsFile).Replace(appSettings.IqsRed, "red").Replace(appSettings.IqsYellow, "Yellow");
File.WriteAllText(fileInfo.FullName, lines);
}
Dictionary<string, List<string>> IInfinityQSV4Repository.GetEngineeringSpcReview()
{
Dictionary<string, List<string>>? results;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetEngineeringSpcReview)}.json"));
results = JsonSerializer.Deserialize<Dictionary<string, List<string>>>(json);
if (results is null)
throw new NullReferenceException(nameof(results));
}
else
{
FileInfo iqsFileInfo = new(_AppSettings.IqsFile);
Assembly assembly = Assembly.GetExecutingAssembly();
string? assemblyName = assembly.GetName()?.Name;
if (string.IsNullOrEmpty(assemblyName))
throw new Exception();
FileInfo localFileInfo = new(Path.Combine(AppContext.BaseDirectory, "wwwroot", iqsFileInfo.Name));
if (!localFileInfo.Exists && (!iqsFileInfo.Exists || iqsFileInfo.Length == 0))
results = new();
else
{
if (!localFileInfo.Exists || localFileInfo.LastWriteTime != iqsFileInfo.LastWriteTime)
FileFindReplaceAndSave(_AppSettings, iqsFileInfo.FullName, localFileInfo);
ReadOnlyCollection<Record> records = !iqsFileInfo.Exists || iqsFileInfo.Length == 0 ? GetRecords(_AppSettings, localFileInfo.FullName) : GetRecords(_AppSettings, iqsFileInfo.FullName);
List<Dictionary<string, Record>> collection = GetCollection(_AppSettings.IqsColumns, records);
results = GetResults(_AppSettings, collection);
}
}
return results;
}
}

View File

@ -312,7 +312,7 @@ public class MetrologyRepository : IMetrologyRepository
return sb.ToString(); return sb.ToString();
} }
internal DataTable GetHeaders(int toolTypeId, DateTime? startTime, DateTime? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords) internal DataTable 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");
@ -341,16 +341,16 @@ public class MetrologyRepository : IMetrologyRepository
} }
else else
{ {
if (startTime.HasValue) if (startTime is not null)
{ {
whereClause = "[Date] >= @StartTime "; whereClause = "[Date] >= @StartTime ";
DateTime startTimeLocal = startTime.Value.ToLocalTime(); DateTime startTimeLocal = DateTime.Parse(startTime).ToLocalTime();
AddParameter(cmd, "@StartTime", startTimeLocal); AddParameter(cmd, "@StartTime", startTimeLocal.ToString("yyyy-MM-dd HH:mm:ss"));
} }
if (endTime.HasValue) if (endTime is not null)
{ {
DateTime endTimeLocal = endTime.Value.ToLocalTime(); DateTime endTimeLocal = DateTime.Parse(endTime).ToLocalTime();
TimeSpan timeSpan = new(DateTime.Now.Ticks - endTimeLocal.Ticks); TimeSpan timeSpan = new(DateTime.Now.Ticks - endTimeLocal.Ticks);
if (timeSpan.TotalMinutes > 5) if (timeSpan.TotalMinutes > 5)
{ {
@ -358,7 +358,7 @@ public class MetrologyRepository : IMetrologyRepository
whereClause += "AND "; whereClause += "AND ";
whereClause += "[Date] <= @EndTime "; whereClause += "[Date] <= @EndTime ";
AddParameter(cmd, "@EndTime", endTimeLocal); AddParameter(cmd, "@EndTime", endTimeLocal.ToString("yyyy-MM-dd HH:mm:ss"));
} }
} }
} }
@ -773,7 +773,7 @@ public class MetrologyRepository : IMetrologyRepository
void IMetrologyRepository.PurgeExistingData(int toolTypeId, string title) => PurgeExistingData(toolTypeId, title); void IMetrologyRepository.PurgeExistingData(int toolTypeId, string title) => PurgeExistingData(toolTypeId, title);
long IMetrologyRepository.InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName) => InsertToolDataJSON(jsonbody, headerId, metaData, tableName); 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.ExportData(string spName, DateTime startTime, DateTime endTime) => ExportData(spName, startTime, endTime);
DataTable IMetrologyRepository.GetHeaders(int toolTypeId, DateTime? startTime, DateTime? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords) => GetHeaders(toolTypeId, startTime, endTime, pageNo, pageSize, headerid, out totalRecords); 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); 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); 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.GetHeaderAttachmentIDByTitle(int toolTypeId, string title) => GetHeaderAttachmentIDByTitle(toolTypeId, title);

View File

@ -1,3 +1,4 @@
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
using System.Text.Json; using System.Text.Json;
@ -11,9 +12,9 @@ public class PinRepository : IPinRepository
private readonly string _RepositoryName; private readonly string _RepositoryName;
private readonly Dictionary<string, Dictionary<long, HeaderCommon>> _RdsToHeaderCommonCollection; private readonly Dictionary<string, Dictionary<long, HeaderCommon>> _RdsToHeaderCommonCollection;
public PinRepository(string mockRoot) public PinRepository(AppSettings appSettings)
{ {
_MockRoot = mockRoot; _MockRoot = appSettings.MockRoot;
_RdsToHeaderCommonCollection = new(); _RdsToHeaderCommonCollection = new();
_RepositoryName = nameof(PinRepository)[..^10]; _RepositoryName = nameof(PinRepository)[..^10];
} }

View File

@ -7,11 +7,6 @@ namespace OI.Metrology.Server.Repository;
public class ServiceShopOrderRepository : IServiceShopOrderRepository public class ServiceShopOrderRepository : IServiceShopOrderRepository
{ {
private readonly ILogger<ServiceShopOrderRepository> _Logger;
public ServiceShopOrderRepository(ILogger<ServiceShopOrderRepository> logger) =>
_Logger = logger;
private static ServiceShopOrder[] GetServiceShopOrders(Shared.Models.ServiceShop? serviceShop) private static ServiceShopOrder[] GetServiceShopOrders(Shared.Models.ServiceShop? serviceShop)
{ {
ServiceShopOrder[] result = IServiceShopOrder.GetServiceShopOrders(serviceShop); ServiceShopOrder[] result = IServiceShopOrder.GetServiceShopOrders(serviceShop);

View File

@ -1,3 +1,4 @@
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.DataModels; 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;
@ -13,9 +14,9 @@ public class ToolTypesRepository : IToolTypesRepository
private readonly string _MockRoot; private readonly string _MockRoot;
private readonly string _RepositoryName; private readonly string _RepositoryName;
public ToolTypesRepository(string mockRoot) public ToolTypesRepository(AppSettings appSettings)
{ {
_MockRoot = mockRoot; _MockRoot = appSettings.MockRoot;
_RepositoryName = nameof(ToolTypesRepository)[..^10]; _RepositoryName = nameof(ToolTypesRepository)[..^10];
} }
@ -77,7 +78,7 @@ public class ToolTypesRepository : IToolTypesRepository
// Gets headers, request/response format is to allow paging with igniteUI // Gets headers, request/response format is to allow paging with igniteUI
// The headerid parameter is used for navigating directly to a header, when the button is clicked in Awaiting Dispo // The headerid parameter is used for navigating directly to a header, when the button is clicked in Awaiting Dispo
Result<DataTable> IToolTypesRepository.GetHeaders(IMetrologyRepository metrologyRepository, int id, DateTime? datebegin, DateTime? dateend, int? page, int? pagesize, long? headerid) Result<DataTable> IToolTypesRepository.GetHeaders(IMetrologyRepository metrologyRepository, int id, string? datebegin, string? dateend, int? page, int? pagesize, long? headerid)
{ {
Result<DataTable>? r; Result<DataTable>? r;
if (!string.IsNullOrEmpty(_MockRoot)) if (!string.IsNullOrEmpty(_MockRoot))
@ -228,7 +229,7 @@ public class ToolTypesRepository : IToolTypesRepository
return result; return result;
} }
Result<DataTable> IToolTypesRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, DateTime? datebegin, DateTime? dateend) Result<DataTable> IToolTypesRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
{ {
Result<DataTable>? r; Result<DataTable>? r;
if (!string.IsNullOrEmpty(_MockRoot)) if (!string.IsNullOrEmpty(_MockRoot))
@ -240,12 +241,12 @@ public class ToolTypesRepository : IToolTypesRepository
} }
else else
{ {
dateend ??= DateTime.Now; DateTime dateEnd = dateend is null ? DateTime.Now : DateTime.Parse(dateend);
datebegin ??= dateend.Value.AddMonths(-1); DateTime dateBegin = datebegin is null ? dateEnd.AddMonths(-1) : DateTime.Parse(datebegin);
ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId); ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId);
if (string.IsNullOrEmpty(tt.ExportSPName)) if (string.IsNullOrEmpty(tt.ExportSPName))
throw new NullReferenceException(nameof(tt.ExportSPName)); throw new NullReferenceException(nameof(tt.ExportSPName));
DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, datebegin.Value, dateend.Value); DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, dateBegin, dateEnd);
r = new() r = new()
{ {
Results = dataTable, Results = dataTable,
@ -304,7 +305,7 @@ public class ToolTypesRepository : IToolTypesRepository
return result.ToString(); return result.ToString();
} }
byte[] IToolTypesRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, DateTime? datebegin, DateTime? dateend) byte[] IToolTypesRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
{ {
byte[] results; byte[] results;
Result<DataTable> result; Result<DataTable> result;

View File

@ -0,0 +1,228 @@
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories;
using System.Globalization;
using System.Text.Json;
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 string _OpenInsightApplicationProgrammingInterface;
public WaferCounterRepository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory, IHttpClientFactory httpClientFactory)
{
_AppSettings = appSettings;
_MockRoot = appSettings.MockRoot;
_HttpClientFactory = httpClientFactory;
_DBConnectionFactory = dbConnectionFactory;
_RepositoryName = nameof(WaferCounterRepository)[..^10];
_OpenInsightApplicationProgrammingInterface = appSettings.OpenInsightApplicationProgrammingInterface;
}
private static void MoveFile(string waferSizeDirectory, FileInfo fileInfo)
{
Calendar calendar = new CultureInfo("en-US").Calendar;
string weekOfYear = $"{fileInfo.LastWriteTime:yyyy}_Week_{calendar.GetWeekOfYear(fileInfo.LastWriteTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday):00}";
string checkDirectory = Path.Combine(waferSizeDirectory, "Archive", weekOfYear);
if (!Directory.Exists(checkDirectory))
_ = Directory.CreateDirectory(checkDirectory);
string checkFile = Path.Combine(checkDirectory, fileInfo.Name);
if (!File.Exists(checkFile))
File.Move(fileInfo.FullName, checkFile);
}
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 string GetWaferSizeDirectory(string area, string waferSize, bool destination) =>
destination ? Path.Combine(_AppSettings.WaferCounterDestinationDirectory, area, waferSize) : Path.Combine(_AppSettings.WaferCounterRootDirectory, area, waferSize);
string? IWaferCounterRepository.GetSlotMap(string line1, string line2) =>
GetRecord(line1, line2).SlotMap;
private static FileInfo[] GetFileInfoCollection(string waferSizeDirectory)
{
List<FileInfo> results = new();
FileInfo[] fileInfoCollection;
string[] files = !Directory.Exists(waferSizeDirectory) ? Array.Empty<string>() : Directory.GetFiles(waferSizeDirectory, "*.wc", SearchOption.TopDirectoryOnly);
fileInfoCollection = (from l in files select new FileInfo(l)).OrderByDescending(l => l.LastWriteTime).ToArray();
if (fileInfoCollection.Length > 0)
results.Add(fileInfoCollection[0]);
for (int i = 1; i < fileInfoCollection.Length; i++)
MoveFile(waferSizeDirectory, fileInfoCollection[i]);
return fileInfoCollection;
}
private static WaferCounter? GetLastQuantityAndSlotMapWithText(string waferSize, string text, FileInfo fileInfo)
{
WaferCounter? result;
string[] lines = File.ReadAllLines(fileInfo.FullName);
if (lines.Length < 2)
result = null;
else
{
string[] segments = fileInfo.Name.Split('-');
Record record = GetRecord(lines[0], lines[1]);
string equipmentId = segments.Length < 2 ? fileInfo.Name : segments[1].Split('.')[0];
if (string.IsNullOrEmpty(record.SlotMap) || record.SlotMap.Length != 25)
result = null; // Wrong length!
else if (record.Total != record.Check)
result = null; // Invalid!
else
result = new(fileInfo.LastWriteTime, fileInfo.LastWriteTime.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;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IWaferCounterRepository.GetLastQuantityAndSlotMap)}.json"));
result = JsonSerializer.Deserialize<WaferCounter>(json);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
string waferSizeDirectory = GetWaferSizeDirectory(area, waferSize, destination: false);
FileInfo[] fileInfoCollection = GetFileInfoCollection(waferSizeDirectory);
if (fileInfoCollection.Length == 0)
result = null;
else
{
string text = string.Empty;
result = GetLastQuantityAndSlotMapWithText(waferSize, text, fileInfoCollection[0]);
}
}
return result;
}
private static void Save(string waferSizeDestinationDirectory, string area, string waferSize, string text, FileInfo fileInfo, WaferCounter result) =>
File.WriteAllText(Path.Combine(waferSizeDestinationDirectory, $"{fileInfo.Name}.csv"), $"100,{waferSize},{area},{fileInfo.LastWriteTime},{text},{result.Total:00},{result.SlotMap} ");
WaferCounter? IWaferCounterRepository.GetLastQuantityAndSlotMapWithText(string area, string waferSize, string text)
{
WaferCounter? result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IWaferCounterRepository.GetLastQuantityAndSlotMapWithText)}.json"));
result = JsonSerializer.Deserialize<WaferCounter>(json);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
string waferSizeDirectory = GetWaferSizeDirectory(area, waferSize, destination: false);
FileInfo[] fileInfoCollection = GetFileInfoCollection(waferSizeDirectory);
if (fileInfoCollection.Length == 0)
result = null;
else
{
result = GetLastQuantityAndSlotMapWithText(waferSize, text, fileInfoCollection[0]);
if (result is not null)
{
string waferSizeDestinationDirectory = _AppSettings.WaferCounterDestinationDirectory;
// string waferSizeDestinationDirectory = GetWaferSizeDirectory(area, waferSize, destination: true);
Save(waferSizeDestinationDirectory, area, waferSize, text, fileInfoCollection[0], result);
}
}
}
return result;
}
}

View File

@ -1,164 +0,0 @@
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories;
using System.Data;
using System.Data.Common;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
namespace OI.Metrology.Server.Repository;
public class WorkMaterialRepository : IWorkMaterialRepository
{
private readonly string _MockRoot;
private readonly string _RepositoryName;
private readonly IDbConnectionFactory _DBConnectionFactory;
public WorkMaterialRepository(string mockRoot, IDbConnectionFactory dbConnectionFactory)
{
_MockRoot = mockRoot;
_DBConnectionFactory = dbConnectionFactory;
_RepositoryName = nameof(WorkMaterialRepository)[..^10];
}
string IWorkMaterialRepository.GetCommandText(int? workOrderNumber, int? workOrderStep, int? workOrderCassette)
{
StringBuilder result = new();
_ = result.Append("select ( ").
Append(" select wi.rds_no, ").
Append(" rr.reactor, ").
Append(" wi.pocket_no, ").
Append(" wi.zone, ").
Append(" wi.in_cass_no, ").
Append(" wi.slot_no [in_slot_no], ").
Append(" isnull(wo.out_cass_no, -1) [out_cass_no], ").
Append(" isnull(wo.slot_no, -1) [out_slot_no], ").
Append(" rr.ps_no, ").
Append(" rr.recipe_name, ").
Append(" rr.recipe_no, ").
Append(" rr.spec_type ").
Append(" from lsl2sql.dbo.wm_in_slot_no wi ").
Append(" inner join lsl2sql.dbo.react_run rr ").
Append(" on wi.wo_no = rr.wo_no ").
Append(" and wi.rds_no = rr.rds_no ").
Append(" left join lsl2sql.dbo.wm_out_slot wo ").
Append(" on wo.wo_no = wi.wo_no ").
Append(" and wo.rds = wi.rds_no ").
Append(" and wo.in_cass_no = wi.in_cass_no ").
Append(" and wo.in_slot_no = wi.slot_no ").
Append(" where wi.wo_no = ").Append(workOrderNumber is null ? -1 : workOrderNumber.Value).Append(' ').
Append(" and wi.rds_no = wm.rds ").
Append(" order by wi.in_cass_no, wi.slot_no ").
Append(" for json path ").
Append(" ) [group] ").
Append("from lsl2sql.dbo.wm_out_slot wm ").
Append("where wm.wo_no = ").Append(workOrderNumber is null ? -1 : workOrderNumber.Value).Append(' ').
Append(" and wm.proc_step_no = ").Append(workOrderStep is null ? -1 : workOrderStep.Value).Append(' ').
Append(" and wm.out_cass_no = ").Append(workOrderCassette is null ? -1 : workOrderCassette.Value).Append(' ').
Append("group by wm.rds ").
Append("order by wm.rds ").
Append("for json path ");
return result.ToString();
}
private static (int?, int?, int?, bool) GetWorkOrder(string mid)
{
int? workOrderStep = null;
int? workOrderNumber = null;
MatchCollection[] collection;
int? workOrderCassette = null;
if (string.IsNullOrEmpty(mid))
collection = Array.Empty<MatchCollection>();
else
{
string pattern = @"^([oiOI])?([0-9]{6,7})\.([0-5]{1})\.([0-9]{1,2})$"; // o171308.1.51
collection = (from l in mid.Split('-') select Regex.Matches(l, pattern)).ToArray();
}
foreach (MatchCollection matchCollection in collection)
{
if (matchCollection.Count == 0)
continue;
if (!matchCollection[0].Success || matchCollection[0].Groups.Count != 5)
continue;
if (!int.TryParse(matchCollection[0].Groups[3].Value, out int workOrderStepValue))
continue;
if (!int.TryParse(matchCollection[0].Groups[2].Value, out int workOrderNumberValue))
continue;
if (!int.TryParse(matchCollection[0].Groups[4].Value, out int workOrderCassetteValue))
continue;
workOrderStep = workOrderStepValue;
workOrderNumber = workOrderNumberValue;
workOrderCassette = workOrderCassetteValue;
break;
}
return new(workOrderNumber, workOrderStep, workOrderCassette, workOrderStep is not null || workOrderNumber is not null || workOrderCassette is not null);
}
private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText)
{
StringBuilder stringBuilder = new();
using DbConnection dbConnection = dbConnectionFactory.GetDbConnection(useOI2Sql: true);
DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = commandText;
DbDataReader dbDataReader = dbCommand.ExecuteReader(CommandBehavior.SequentialAccess);
while (dbDataReader.Read())
_ = stringBuilder.Append(dbDataReader.GetString(0));
return stringBuilder;
}
Result<WorkMaterialV2[]> IWorkMaterialRepository.GetCassette(string mid)
{
Result<WorkMaterialV2[]>? result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IWorkMaterialRepository.GetCassette)}.json"));
result = JsonSerializer.Deserialize<Result<WorkMaterialV2[]>>(json);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
WorkMaterialV2[] results;
(int? workOrderNumber, int? workOrderStep, int? workOrderCassette, bool isWorkOrder) = GetWorkOrder(mid);
if (!isWorkOrder)
results = Array.Empty<WorkMaterialV2>();
else
{
WorkMaterial[]? group;
JsonProperty[] jsonProperties;
List<WorkMaterial> collection = new();
IWorkMaterialRepository workMaterialRepository = this;
string commandText = workMaterialRepository.GetCommandText(workOrderNumber, workOrderStep, workOrderCassette);
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText);
JsonElement[]? jsonElements = stringBuilder.Length == 0 ? Array.Empty<JsonElement>() : JsonSerializer.Deserialize<JsonElement[]>(stringBuilder.ToString());
if (jsonElements is null)
throw new NullReferenceException(nameof(jsonElements));
foreach (JsonElement jsonElement in jsonElements)
{
if (jsonElement.ValueKind != JsonValueKind.Object)
continue;
jsonProperties = jsonElement.EnumerateObject().ToArray();
if (jsonProperties.Length == 0)
continue;
group = JsonSerializer.Deserialize<WorkMaterial[]>(jsonProperties.First().Value.ToString(), new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
if (group is null)
continue;
foreach (WorkMaterial workMaterial in group)
collection.Add(workMaterial);
}
if (collection is null)
throw new NullReferenceException(nameof(collection));
results = WorkMaterial.Convert(collection);
}
result = new()
{
Results = results,
TotalRows = results.Length,
};
}
return result;
}
}

View File

@ -13,7 +13,7 @@ public class SQLDbConnectionFactory : IDbConnectionFactory
public SQLDbConnectionFactory(AppSettings appSettings) => _AppSettings = appSettings; public SQLDbConnectionFactory(AppSettings appSettings) => _AppSettings = appSettings;
public DbConnection GetDbConnection(bool? useOI2Sql) public DbConnection GetDbConnection(bool? useIqsConnection)
{ {
DbProviderFactories.RegisterFactory( DbProviderFactories.RegisterFactory(
typeof(SqlConnection).Namespace, typeof(SqlConnection).Namespace,
@ -22,11 +22,8 @@ public class SQLDbConnectionFactory : IDbConnectionFactory
if (string.IsNullOrEmpty(_AppSettings.ConnectionString)) if (string.IsNullOrEmpty(_AppSettings.ConnectionString))
throw new Exception("Connection string is missing"); throw new Exception("Connection string is missing");
if (string.IsNullOrEmpty(_AppSettings.OI2SqlConnectionString))
throw new Exception("Connection string is missing");
DbConnection dbConnection = SqlClientFactory.Instance.CreateConnection(); DbConnection dbConnection = SqlClientFactory.Instance.CreateConnection();
dbConnection.ConnectionString = useOI2Sql is not null && useOI2Sql.Value ? _AppSettings.OI2SqlConnectionString : _AppSettings.ConnectionString; dbConnection.ConnectionString = useIqsConnection is null || !useIqsConnection.Value ? _AppSettings.ConnectionString : throw new Exception();
dbConnection.Open(); dbConnection.Open();
return dbConnection; return dbConnection;
} }

View File

@ -98,8 +98,7 @@ public class SpreadingResistanceProfileService : ISpreadingResistanceProfileServ
private static ReadOnlyCollection<string> GetRectanglesDescriptions(Info info, Setup setup, List<Layer> layers) private static ReadOnlyCollection<string> GetRectanglesDescriptions(Info info, Setup setup, List<Layer> layers)
{ {
List<string> results = new() List<string> results = new() {
{
string.Empty, // 0 string.Empty, // 0
string.Empty, // 1 string.Empty, // 1
string.Empty, // 2 string.Empty, // 2

View File

@ -73,7 +73,6 @@
<li>@Html.ActionLink("Run Information", "RunInfo", "Pages", new { area = "" }, null)</li> <li>@Html.ActionLink("Run Information", "RunInfo", "Pages", new { area = "" }, null)</li>
<li>@Html.ActionLink("Run Headers", "RunHeaders", "Pages", new { area = "" }, null)</li> <li>@Html.ActionLink("Run Headers", "RunHeaders", "Pages", new { area = "" }, null)</li>
<li>@Html.ActionLink("Export", "Index", "Export", new { area = "" }, null)</li> <li>@Html.ActionLink("Export", "Index", "Export", new { area = "" }, null)</li>
<li>@Html.ActionLink("Work Material", "WorkMaterial", "Reactors", new { area = "" }, null)</li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li> <li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
</ul> </ul>
<p class="navbar-text navbar-right"> <p class="navbar-text navbar-right">

View File

@ -379,6 +379,51 @@ function GetMinMax(profilePoints, index) {
return { decades, maxDepth, concentrationMin, concentrationMax, resistanceEditedMin, resistanceEditedMax, resistivityMin, resistivityMax }; return { decades, maxDepth, concentrationMin, concentrationMax, resistanceEditedMin, resistanceEditedMax, resistivityMin, resistivityMax };
} }
function appendDiv() {
const div = document.createElement("div");
div.innerHTML = `
<table border = 1>
<thead>
<tr>
<th>Day Shift</th>
<th>State</th>
<th>Loaded RDS</th>
<th>Average Temperature</th>
<th>Offset %</th>
<th>Time Collected</th>
<th>Hours</th>
<th>&nbsp;</th>
<th>Night Shift</th>
<th>State</th>
<th>Loaded RDS</th>
<th>Average Temperature</th>
<th>Offset %</th>
<th>Time Collected</th>
<th>Hours</th>
</tr>
</thead>
<tbody id ="EpiProTempVerification"></tbody>
</table>
`;
const element = document.getElementById("DataAttachmentDiv");
element.appendChild(div);
const tbody = document.getElementById("EpiProTempVerification");
$.ajax({
type: "GET",
url: _apiUrl + '/InfinityQSV3/epi-pro-temp-verification/?night=44&night=46&night=52&night=54',
success: function (r) {
if (r == null)
ShowErrorMessage("Invalid data");
else {
tbody.innerHTML = r;
}
},
error: function (e, _ajaxOptions, ex) {
DisplayWSMessage("error", "There was an error getting data.", e, ex);
}
});
}
function setChart(index, ctx, data) { function setChart(index, ctx, data) {
var cd; var cd;
var depth; var depth;
@ -557,10 +602,14 @@ function detailSelectionChangedRunInfo(evt, ui) {
} }
} }
else { else {
var ctx = document.getElementById('DataAttachmentCanvas'); if (ui.row.index == 4)
$.getJSON(attachmentUrlBase + "/header/files/" + headerAttachmentId + "/" + _toolType.DisplayHeaderAttachment, function (data) { appendDiv();
setChart(ui.row.index, ctx, data); else {
}); var ctx = document.getElementById('DataAttachmentCanvas');
$.getJSON(attachmentUrlBase + "/header/files/" + headerAttachmentId + "/" + _toolType.DisplayHeaderAttachment, function (data) {
setChart(ui.row.index, ctx, data);
});
}
} }
} }
@ -1028,8 +1077,7 @@ function oiExportButtonRunInfo() {
} }
function setInitialDateTimesRunInfo(milliseconds) { function setInitialDateTimesRunInfo(milliseconds) {
if (!milliseconds) if (!milliseconds) {
{
var startDate = $("#StartDate").igDatePicker("value"); var startDate = $("#StartDate").igDatePicker("value");
var startTime = $("#StartTime").igTimePicker("value"); var startTime = $("#StartTime").igTimePicker("value");
var endDate = $("#EndDate").igDatePicker("value"); var endDate = $("#EndDate").igDatePicker("value");

View File

@ -0,0 +1,106 @@
var _count = -1;
var _apiUrl = null;
function getUrlParameter(param) {
var pageURL = window.location.search.substring(1),
urlVariables = pageURL.split('&'),
parameterName,
i;
for (i = 0; i < urlVariables.length; i++) {
parameterName = urlVariables[i].split('=');
if (parameterName[0] === param) {
return parameterName[1] === undefined ? true : decodeURIComponent(parameterName[1]);
}
}
return false;
}
function setWafers(waferMap) {
var slots = waferMap.split("");
if (slots.length !== 25)
throw Error;
$('.slot').each(function (index) {
if (slots[index] === '0')
$(this).addClass('waferSlotEmpty').removeClass('waferSlotPresent');
else if (slots[index] === '1')
$(this).addClass('waferSlotPresent').removeClass('waferSlotEmpty');
else
throw Error;
});
}
function setValues(data) {
if (!data)
clearMap();
else {
$('#waferCount').val(data.total);
setWafers(data.waferMap);
$('#lastDateTime').text(new Date().toLocaleString());
}
}
function clearText() {
$("#lot").val('');
$("#lot").show();
$("#lot").focus();
}
function clearMap() {
setWafers('0000000000000000000000000');
}
function poll() {
if (_count >= _stop) {
_count = -1;
$("#Connect").show();
$('#lastDateTime').hide();
}
else if (_count > -1) {
_count++;
$.get(_apiUrl + $("#toolId").val() + '/last-quantity-and-wafer-map/?area=' + $("#operation").val(), function (data) {
setValues(data);
}).fail(function () {
ShowErrorMessage("Error");
});
}
}
function save() {
$.get(_apiUrl + $("#toolId").val() + '/last-quantity-and-wafer-map-with-text/?area=' + $("#operation").val() + '&text=' + $("#lot").val(), function (data) {
setValues(data);
}).fail(function () {
ShowErrorMessage("Error");
});
}
function initWaferCounter(apiUrl) {
_apiUrl = apiUrl;
$("#Save").click(function () {
save();
});
$("#Clear").click(function () {
clearText();
clearMap();
});
$("#Connect").click(function () {
$("#Connect").hide();
$('#lastDateTime').show();
_count = 0;
clearMap();
});
// http://localhost:5051/wafer-counter.html?interval=1000&stop=3&toolId=8INCH&operation=EPP-East&a=1
$('#waferCount').val('0');
$('#lastDateTime').hide();
var stop = getUrlParameter('stop');
_stop = !stop ? 10 : parseInt(stop);
var interval = getUrlParameter('interval');
$("#toolId").val(getUrlParameter('toolId'));
$("#operation").val(getUrlParameter('operation'));
setInterval(function () {
poll();
}, !interval ? 10000 : parseInt(interval));
clearText();
clearMap();
}

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,413 @@
# Infineon Design System Stencil Web Components (MVP)
[![GitHub Repo Issues](https://img.shields.io/github/issues/Infineon/infineon-design-system-stencil?style=plastic)](https://github.com/Infineon/infineon-design-system-stencil/issues)
[![GitHub Pull Requests](https://img.shields.io/github/issues-pr-raw/Infineon/infineon-design-system-stencil?style=plastic)](https://github.com/Infineon/infineon-design-system-stencil/pulls)
[![GitHub Repo Version](https://img.shields.io/github/package-json/v/Infineon/infineon-design-system-stencil?style=plastic)](https://github.com/Infineon/infineon-design-system-stencil/blob/master/package.json)
[![GitHub Master Branch Weekly Commits](https://img.shields.io/github/commit-activity/w/Infineon/infineon-design-system-stencil/master?style=plastic)](https://github.com/Infineon/infineon-design-system-stencil/tree/master)
[![GitHub Repo Contributors](https://img.shields.io/github/contributors/Infineon/infineon-design-system-stencil?style=plastic)](https://github.com/Infineon/infineon-design-system-stencil/graphs/contributors)
[![GitHub Repo Discussions](https://img.shields.io/github/discussions/Infineon/infineon-design-system-stencil)](https://github.com/Infineon/infineon-design-system-stencil/)
<!-- TABLE OF CONTENTS -->
<details id="tableContent">
<summary>Table of Contents</summary>
<ol>
<li>
<a href="#about-the-project">About The Project</a>
<ul>
<li><a href="#built-with">Built With</a></li>
<li><a href="#examples">Example applications demonstrating the usage of the IFX web components</a></li>
</ul>
</li>
<li><a href="#project-structure">Project structure</a></li>
<li>
<a href="#getting-started">Getting Started</a>
<ul>
<li><a href="#prerequisites">Prerequisites</a></li>
<li><a href="#installation">Installation</a><li>
<ul>
<li><a href="#angular">Angular</a></li>
<li><a href="#react/vue">React/Vue</a></li>
<li><a href="#vanilla">Vanilla</a></li>
</ul>
</ul>
</li>
<li><a href="#usage-of-components">Usage</a></li>
<li><a href="#local-development">Local development</a></li>
<li><a href="#contributing">Contributing</a></li>
<li><a href="#contact">Contact</a></li>
</ol>
</details>
<!-- ABOUT THE PROJECT -->
## About The Project
As part of the Infineon brand guidelines, the Infineon Digital Design System supports designers, developers and project managers to build user interfaces faster and better with the ultimate goal to create a coherent and optimal user journey across all internal and external Infineon digital touchpoints.
This repository contains an implementation of Infineons Digital Design System and it's Storybook sourcecode using Stencil web components.
Use it to build & run storybook and distribute the Stencil web components.
### Built With
[Stencil web components][Stencil-url]
### Example applications demonstrating the usage of IFX Web Components
- [Angular][Angular-example]
- [React + Javascript][React-example]
- [Vanilla][Vanilla-example]
- [Vue + Javascript][Vue-example]
<p align="right"><a href="#tableContent">back to top</a></p>
## Project structure
### Overall structure
The repository has a monorepo architecture using Lerna. It contains not only our Stencil Web Components, but also framework integrations for Vue and React as well as example applications demonstrating component usage (not included in the Lerna workspaces)
### Wrapper components
Stencil Web Components can be used with any JavaScript framework or with no framework at all, just like any other HTML elements. This is because they are built on Web APIs that are native to the browser. They are self-contained and encapsulate their functionality in a way that makes them portable and easy to drop into any project.
To bridge the gap between Stencil components and specific frameworks, it can be useful to create wrapper components
A Stencil Wrapper Component is a component that wraps around a Stencil Web Component and translates the properties, events, and methods to work seamlessly within the specific framework context.
Our Wrapper Components are built automatically every time ```npm run stencil:build``` is executed.
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
---
<!-- GETTING STARTED -->
## Getting Started
### Prerequisites
- [Node](https://nodejs.org/en/) > v16 .
- [Yarn](https://classic.yarnpkg.com/en/) > v1.22.10, or [Npm](https://www.npmjs.com/) > v8.
### Installation of the component libraray
---
#### Angular
**1.**
- **with NPM**
```npm install --save @infineon/infineon-design-system-stencil```
- **with Yarn**
```yarn add @infineon/infineon-design-system-stencil```
**2. Installation of SASS**
```bash
npm install sass
```
**3. Import the module inside your entry point file**
```bash
#main.ts
import { defineCustomElements } from "@infineon/infineon-design-system-stencil/loader";
defineCustomElements(window);
```
**4. Additional steps only for Angular**
Inside <b>app.modules.ts</b> file:
```bash
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
@NgModule({
...
schemas: [
CUSTOM_ELEMENTS_SCHEMA
],
...
})
```
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
---
#### React
React Wrappers: Similarly to Vue, a React wrapper provides a React interface to a Stencil web component, making the web component feel more like a typical React component. This includes proper handling of props, state, and events within the context of a React application.
**1. Installation**
**- with NPM**
```npm install @infineon/infineon-design-system-react```
**- with Yarn**
```yarn add @infineon/infineon-design-system-react```
**2. Installation of SASS**
```bash
npm install sass
```
**3. Import the module inside your entry point file**
```js
import { defineCustomElements } from '@infineon/infineon-design-system-react';
//...
defineCustomElements(window)
```
In React, there isn't a built-in mechanism to globally register components like in Vue. Therefore, components need to be imported in the file that they are being used in.
**4. Usage**
```js
import { IfxProgressBar, IfxSearchBar, IfxButton } from '@infineon/infineon-design-system-react';
//...
<IfxSearchBar onIfxChange={handleSearch} show-close-button="true"></IfxSearchBar>
```
**React + Javascript specific**
It may be necessary to add the following to your .env file at project root:
``GENERATE_SOURCEMAP=false``
This can also be achieved by updating your start script in the ``package.json`` accordingly.
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
---
#### Vanilla
Include the following script tag in your index.html
```bash
<script type="module" src="https://cdn.jsdelivr.net/npm/@infineon/infineon-design-system-stencil/dist/infineon-design-system-stencil/infineon-design-system-stencil.esm.js"></script>'
```
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
---
#### Vue
**1. Installation**
**- with NPM**
```npm install @infineon/infineon-design-system-vue```
**- with Yarn**
```yarn add @infineon/infineon-design-system-vue```
**2. Installation of SASS**
```bash
npm install sass
```
**3. Import the module inside your entry point file**
```js
//main.js/main.ts
import { ComponentLibrary } from '@infineon/infineon-design-system-vue';
//...
createApp(App).use(ComponentLibrary).mount('#app');
```
In Vue, this registers the components globally.
**4. Usage**
```js
<ifx-progress-bar v-model="progress" size="m" show-label="true"></ifx-progress-bar>
```
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
---
## General usage of IFX web components
Explore our currently available web components in Storybook. You will also find the code snippets needed to include them in your application.
https://infineon.github.io/infineon-design-system-stencil
<br>
---
## Using only the Icons
For the case in which you only want to use our icons, please follow these steps:
1. install the package by following the instructions for the respective framework
2. Import only the ifx-icon component inside your entry point file as explained below;
For React: <b>index.js/index.ts</b> <br />
For Vue: <b>main.js/main.ts</b> <br />
For Angular: <b>main.ts</b>
```bash
import { defineCustomElement as defineCustomElementIfxIcon } from "@infineon/infineon-design-system-stencil/dist/components/ifx-icon";
defineCustomElementIfxIcon(window);
```
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
---
## Local development
### Installation
```bash
git clone https://github.com/Infineon/infineon-design-system-stencil.git
```
Install all the modules and dependencies listed on the ```package.json``` file with:
```bash
yarn/npm install
```
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
---
### Build Storybook
To run Storybook to view and test our Stencil Web Components, we first need to export it as a static web app.
For building the application for the first time (to load fonts, assets and stylesheets) run:
```bash
yarn/npm run build:components
```
### Start Storybook
To run storybook locally (automatically rebuilds on changes), run:
```bash
yarn/npm run storybook
```
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
---
### Example applications
To test the standard Stencil components within our example applicatons, navigate to
```bash
cd examples/stencil-components
```
and go to the folder for Vue, React, Angular or VanillaJs. Follow the instructions described in the ```readme.md``` in each of these folders.
To test the Wrapper components within React or Vue applicatons, navigate to
```bash
cd examples/wrapper-components
```
and go to the application folder you want to use for testing. (React-Ts, React-Js, Vue-Ts, Vue-Js). Again, follow the instructions described in the ```readme.md``` in each of these folders.
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
---
### Contributing
+ Clone the repository
+ Create an issue with a proper description (Naming convention: 'name-of-component: feature/bug')
+ Create a pull request with a proper description
+ Request a review (tishoyanchev || verena-ifx)
<p align="right"><a href="#tableContent">back to top</a></p>
<br>
## Contact
### Email
dds@infineon.com <br />
<p align="right"><a href="#tableContent">back to top</a></p>
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
[contributors-shield]: https://img.shields.io/github/contributors/othneildrew/Best-README-Template.svg?style=for-the-badge
[contributors-url]: https://github.com/othneildrew/Best-README-Template/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/othneildrew/Best-README-Template.svg?style=for-the-badge
[forks-url]: https://github.com/othneildrew/Best-README-Template/network/members
[stars-shield]: https://img.shields.io/github/stars/othneildrew/Best-README-Template.svg?style=for-the-badge
[stars-url]: https://github.com/othneildrew/Best-README-Template/stargazers
[issues-shield]: https://img.shields.io/github/issues/othneildrew/Best-README-Template.svg?style=for-the-badge
[issues-url]: https://github.com/othneildrew/Best-README-Template/issues
[license-shield]: https://img.shields.io/github/license/othneildrew/Best-README-Template.svg?style=for-the-badge
[license-url]: https://github.com/othneildrew/Best-README-Template/blob/master/LICENSE.txt
[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555
[linkedin-url]: https://linkedin.com/in/othneildrew
[product-screenshot]: images/screenshot.png
[Next.js]: https://img.shields.io/badge/next.js-000000?style=for-the-badge&logo=nextdotjs&logoColor=white
[Next-url]: https://nextjs.org/
[React.js]: https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB
[React-url]: https://reactjs.org/
[Vue.js]: https://img.shields.io/badge/Vue.js-35495E?style=for-the-badge&logo=vuedotjs&logoColor=4FC08D
[Vue-url]: https://vuejs.org/
[Angular.io]: https://img.shields.io/badge/Angular-DD0031?style=for-the-badge&logo=angular&logoColor=white
[Angular-url]: https://angular.io/
[Svelte.dev]: https://img.shields.io/badge/Svelte-4A4A55?style=for-the-badge&logo=svelte&logoColor=FF3E00
[Svelte-url]: https://svelte.dev/
[Laravel.com]: https://img.shields.io/badge/Laravel-FF2D20?style=for-the-badge&logo=laravel&logoColor=white
[Laravel-url]: https://laravel.com
[Bootstrap.com]: https://img.shields.io/badge/Bootstrap-563D7C?style=for-the-badge&logo=bootstrap&logoColor=white
[Bootstrap-url]: https://getbootstrap.com
[JQuery.com]: https://img.shields.io/badge/jQuery-0769AD?style=for-the-badge&logo=jquery&logoColor=white
[JQuery-url]: https://jquery.com
[Stencil-url]: https://stenciljs.com/
[Vue-example]: https://infineon.github.io/infineon-design-system-stencil/vue-example
[React-example]: https://infineon.github.io/infineon-design-system-stencil/react-example
[Angular-example]: https://infineon.github.io/infineon-design-system-stencil/angular-example
[Vanilla-example]: https://infineon.github.io/infineon-design-system-stencil/vanilla-example

View File

@ -0,0 +1,24 @@
'use strict';
function getDefaultExportFromCjs (x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}
function createCommonjsModule(fn, basedir, module) {
return module = {
path: basedir,
exports: {},
require: function (path, base) {
return commonjsRequire();
}
}, fn(module, module.exports), module.exports;
}
function commonjsRequire () {
throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs');
}
exports.createCommonjsModule = createCommonjsModule;
exports.getDefaultExportFromCjs = getDefaultExportFromCjs;
//# sourceMappingURL=_commonjsHelpers-4213291f.js.map

View File

@ -0,0 +1 @@
{"file":"_commonjsHelpers-4213291f.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,110 @@
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
const index = require('./index-ca0e0765.js');
const accordionCss = ":root{--ifx-font-family:\"Source Sans 3\";font-family:var(--ifx-font-family, sans-serif)}:host{display:block}.accordion-wrapper{display:flex;flex-direction:column;gap:8px;font-family:var(--ifx-font-family)}";
const Accordion = class {
constructor(hostRef) {
index.registerInstance(this, hostRef);
this.autoCollapse = false;
}
async onItemOpen(event) {
if (this.autoCollapse) {
const items = Array.from(this.el.querySelectorAll('ifx-accordion-item'));
for (const item of items) {
const itemElement = item;
if (itemElement !== event.target && (await itemElement.open)) {
itemElement.open = false;
}
}
}
}
render() {
return (index.h("div", { class: "accordion-wrapper" }, index.h("slot", null)));
}
get el() { return index.getElement(this); }
};
Accordion.style = accordionCss;
const accordionItemCss = ":root{--ifx-font-family:\"Source Sans 3\";font-family:var(--ifx-font-family, sans-serif)}.accordion-item{border-radius:3px;overflow:hidden;transition:all 0.3s;font-family:var(--ifx-font-family)}.accordion-title:hover{border:1px solid #EEEDED;color:#08665C}.accordion-title{display:flex;align-items:center;padding:12px 16px;gap:12px;color:#0A8276;background-color:#FFFFFF;border:1px solid #EEEDED;cursor:pointer}.accordion-caption{font-weight:600;font-size:1.125rem}.accordion-content{gap:8px;max-height:0;overflow:hidden;transition:max-height 0.3s ease-in-out;line-height:24px;font-size:1rem;font-weight:400}.inner-content{background-color:#FFFFFF;padding:24px;word-wrap:break-word;overflow-wrap:anywhere;align-self:stretch;}.accordion-icon{font-weight:bold;display:inline-block;transition:transform 0.3s}.accordion-icon:hover{color:#08665C}.accordion-item.open .accordion-icon{transform:rotate(-180deg)}";
const IfxAccordionItem = class {
constructor(hostRef) {
index.registerInstance(this, hostRef);
this.ifxItemOpen = index.createEvent(this, "ifxItemOpen", 7);
this.ifxItemClose = index.createEvent(this, "ifxItemClose", 7);
this.caption = undefined;
this.open = false;
this.initialCollapse = true;
this.internalOpen = false;
}
componentWillLoad() {
this.internalOpen = this.open;
if (!this.initialCollapse) {
this.internalOpen = true;
}
}
componentDidLoad() {
this.openAccordionItem();
}
componentDidUpdate() {
this.openAccordionItem();
}
openChanged(newValue) {
this.internalOpen = newValue;
}
toggleOpen() {
this.internalOpen = !this.internalOpen;
this.open = this.internalOpen;
if (this.internalOpen) {
this.ifxItemOpen.emit({ isOpen: this.internalOpen });
}
else {
this.ifxItemClose.emit({ isClosed: !this.internalOpen });
}
}
openAccordionItem() {
if (this.internalOpen) {
this.contentEl.style.maxHeight = `${this.contentEl.scrollHeight}px`;
}
else {
this.contentEl.style.maxHeight = '0';
}
}
handleSlotChange(e) {
const slotElement = e.target;
const nodes = slotElement.assignedNodes();
if (nodes.length > 0) {
nodes.forEach(node => {
const observer = new MutationObserver((mutationsList, _) => {
for (let mutation of mutationsList) {
if (mutation.type === 'childList') {
if (this.internalOpen) {
this.openAccordionItem();
}
}
}
});
observer.observe(node, { attributes: true, childList: true, subtree: true });
});
}
if (this.internalOpen) {
this.openAccordionItem();
}
}
render() {
return (index.h("div", { "aria-label": this.caption, class: `accordion-item ${this.internalOpen ? 'open' : ''}` }, index.h("div", { class: "accordion-title", onClick: () => this.toggleOpen() }, index.h("span", { class: "accordion-icon" }, index.h("ifx-icon", { icon: "chevron-down-12" })), index.h("span", { class: "accordion-caption" }, this.caption)), index.h("div", { class: "accordion-content", ref: (el) => (this.contentEl = el) }, index.h("div", { class: "inner-content" }, index.h("slot", { onSlotchange: (e) => this.handleSlotChange(e) })))));
}
static get watchers() { return {
"open": ["openChanged"]
}; }
};
IfxAccordionItem.style = accordionItemCss;
exports.ifx_accordion = Accordion;
exports.ifx_accordion_item = IfxAccordionItem;
//# sourceMappingURL=ifx-accordion_2.cjs.entry.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,30 @@
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
const index = require('./index-ca0e0765.js');
const alertCss = ":root{--ifx-font-family:\"Source Sans 3\";font-family:var(--ifx-font-family, sans-serif)}:host{display:block}.alert__info-wrapper{display:flex;padding:16px 24px;font-family:var(--ifx-font-family)}.alert__info-wrapper .info__text-wrapper{display:flex;flex-direction:column;gap:8px;width:100%}.alert__info-wrapper .info__text-wrapper .info__headline-wrapper{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.alert__info-wrapper .info__text-wrapper .info__headline-wrapper,.alert__info-wrapper .info__text-wrapper .info__description-wrapper{color:#1D1D1D;font-size:16px;font-style:normal;font-weight:600;line-height:24px}.alert__info-wrapper .info__text-wrapper .info__headline-wrapper ::slotted(p),.alert__info-wrapper .info__text-wrapper .info__description-wrapper ::slotted(p){padding:0;margin:0}.alert__info-wrapper .info__text-wrapper .info__description-wrapper{font-weight:400}.alert__info-wrapper .close-icon-wrapper{display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start}.alert__info-wrapper .close-icon-wrapper a{line-height:0;color:#1D1D1D}.alert{display:flex;border:1px solid #0A8276;border-radius:1px;color:#1D1D1D;background-color:#FFFFFF;font-family:var(--ifx-font-family)}.alert .close-icon-wrapper{display:flex;align-items:center;justify-content:center;min-width:40px}.alert .close-icon-wrapper a{line-height:0;color:#1D1D1D}.alert .icon-wrapper{position:relative;min-width:48px;display:flex;justify-content:center;align-items:center;background-color:#0A8276}.alert .alert-text{font-size:16px;width:100%;padding:12px 0px 12px 12px;color:#1D1D1D;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:anywhere;}.alert.primary{border:1px solid #0A8276}.alert.primary .icon-wrapper{background-color:#0A8276;color:#FFFFFF}.alert.secondary{border:1px solid #9C216E}.alert.secondary .icon-wrapper{background-color:#9C216E;color:#FFFFFF}.alert.danger{border:1px solid #CD002F}.alert.danger .icon-wrapper{background-color:#CD002F;color:#FFFFFF}.alert.warning{border:1px solid #E16B25}.alert.warning .icon-wrapper{background-color:#E16B25;color:#FFFFFF}.close-icon-wrapper ifx-icon:hover{cursor:pointer}";
const Alert = class {
constructor(hostRef) {
index.registerInstance(this, hostRef);
this.ifxClose = index.createEvent(this, "ifxClose", 7);
this.variant = 'primary';
this.icon = undefined;
this.closable = true;
}
handleClose() {
this.ifxClose.emit();
}
render() {
return (this.variant === 'info'
? index.h("div", { class: 'alert__info-wrapper' }, index.h("div", { class: 'info__text-wrapper' }, index.h("div", { class: "info__headline-wrapper" }, index.h("slot", { name: 'headline' })), index.h("div", { class: "info__description-wrapper" }, index.h("slot", { name: 'desc' }))), this.closable && index.h("div", { class: "close-icon-wrapper" }, index.h("a", { href: undefined, onClick: this.handleClose.bind(this) }, index.h("ifx-icon", { icon: 'cross-16' }))))
: index.h("div", { class: `alert ${this.variant}` }, this.icon && (index.h("div", { class: 'icon-wrapper' }, index.h("ifx-icon", { icon: this.icon }))), index.h("div", { class: "alert-text" }, index.h("slot", null)), this.closable && index.h("div", { class: "close-icon-wrapper" }, index.h("a", { href: undefined, onClick: this.handleClose.bind(this) }, index.h("ifx-icon", { icon: 'cross-16' })))));
}
};
Alert.style = alertCss;
exports.ifx_alert = Alert;
//# sourceMappingURL=ifx-alert.cjs.entry.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,21 @@
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
const index = require('./index-ca0e0765.js');
const badgeCss = ":root{--ifx-font-family:\"Source Sans 3\";font-family:var(--ifx-font-family, sans-serif)}:host{display:inline-flex}.badge__container{display:inline-flex;justify-content:center;align-items:center;padding:4px 8px;gap:8px;border:1px solid #EEEDED;background-color:#EEEDED;border-radius:100px;font-family:var(--ifx-font-family);font-size:0.875rem;line-height:1.25rem;font-weight:400;color:#1D1D1D}";
const Badge = class {
constructor(hostRef) {
index.registerInstance(this, hostRef);
}
render() {
return (index.h("div", { class: "badge__container" }, index.h("slot", null)));
}
};
Badge.style = badgeCss;
exports.ifx_badge = Badge;
//# sourceMappingURL=ifx-badge.cjs.entry.js.map

View File

@ -0,0 +1 @@
{"file":"ifx-badge.entry.cjs.js","mappings":";;;;;;AAAA,MAAM,QAAQ,GAAG,2YAA2Y;;MCO/Y,KAAK;;;;EAEhB,MAAM;IACJ,QACEA,iBAAK,KAAK,EAAC,kBAAkB,IAC3BA,qBAAQ,CACJ,EACN;GACH;;;;;;","names":["h"],"sources":["src/components/badge/badge.scss?tag=ifx-badge&encapsulation=shadow","src/components/badge/badge.tsx"],"sourcesContent":["@use \"~@infineon/design-system-tokens/dist/tokens\";\n@use \"../../global/font.scss\";\n\n:host {\n display: inline-flex;\n}\n\n.badge__container {\n display: inline-flex;\n justify-content: center;\n align-items: center;\n padding: 4px 8px;\n gap: tokens.$ifxSpace100;\n border: 1px solid tokens.$ifxColorEngineering200;\n background-color: tokens.$ifxColorEngineering200;\n border-radius: 100px;\n font-family: var(--ifx-font-family);\n font-size: tokens.$ifxFontSizeS;\n line-height: tokens.$ifxLineHeightS;\n font-weight: 400;\n color: tokens.$ifxColorBaseBlack;\n}","import { Component, h } from '@stencil/core';\n\n@Component({\n tag: 'ifx-badge',\n styleUrl: 'badge.scss',\n shadow: true\n})\nexport class Badge {\n\n render() {\n return (\n <div class=\"badge__container\">\n <slot />\n </div>\n );\n }\n}"],"version":3}

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More