Compare commits

...

41 Commits

Author SHA1 Message Date
4c2bef71ec Characterization Data
FI Backlog with Ignore Tag
2024-09-19 10:13:10 -07:00
b824c4ba36 Get text from OI 2024-08-28 15:58:20 -07:00
1ad6246b8d Bug fix for export 2024-07-30 11:36:27 -07:00
478aecf2c8 Link to OI Wizard and new files page 2024-07-17 10:58:48 -07:00
fe3292133e Expose error message using ProducesResponseType 2024-06-18 13:36:30 -07:00
e7b721fdb3 awaiting-disposition-header-attachment-id 2024-06-18 10:55:12 -07:00
da3e839a48 Host from Windows 2024-06-17 17:11:36 -07:00
6737ddfb59 Static Site 2024-06-14 16:51:30 -07:00
3aed250488 Bug fix: Missing Singleton 2024-05-25 10:27:10 -07:00
f53ae8c1c8 Bug fix: Attachment 2024-05-23 17:08:44 -07:00
6317c385f6 Separated Wafer-Counter
JsonElement instead of Request body
Attachment Class
Bump
Ready to test GetLastGroupIdWithValue
Changed to v4
2024-05-21 12:40:20 -07:00
5c9f0d1aff Remove with Text
Remove GetEngineeringSpcReview
Better error message
EnforceCodeStyleInBuild
NginxFileSystem
Remove Reactors and Working Directory
AppSettings
Delete self contained Thunder Tests
Back to .net8.0
api/v4/InfinityQS
ApiExplorerSettings
Wafer Counter
2024-04-15 13:13:55 -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
f684c4b7ef ec.local => infineon.com
New UserSecretsId
2023-10-31 21:40:11 -07:00
4cc5219409 PDSF (Process Data Standard Format) to use EAF for
pushing to OI
2023-07-24 13:29:13 -07:00
6668806432 log 0 2023-05-16 13:12:43 -07:00
e084fdd58f Spreading Resistance Profile with ChartJS,
Copy-On-Get and nuget bump (Serilog)
2023-05-16 08:20:35 -07:00
6b409294e4 Task 353201 2023-05-03 09:50:44 -07:00
9774b0cc53 Changed to use both wm in and out 2023-04-24 12:31:45 -07:00
c82a8790e7 SQL Bug II 2023-04-19 14:00:50 -07:00
c68b853c64 SQL Bug 2023-04-19 08:48:01 -07:00
2f3f1b7947 Changed path and Changed seconds to Alpha 2023-04-19 08:33:17 -07:00
c655ed5c6b Add link to WorkMaterial
Add new columns OC and OS count
2023-04-18 11:43:52 -07:00
70c1e1a52a Updated azure-pipelines-server.yml
Changed to thunderclient to messa017
Nuget Bump
Scan Helper
2023-04-17 14:23:46 -07:00
72b648589e Multiple Stages
IFX Nuget
IIS Development and Windows Service plus IIS
Flop logic on conditional compile
2023-04-06 16:43:22 -07:00
66f38fcf33 nuget bump and userSecrets tasks and query update for event
Allow multiple ids are present
2023-04-05 13:15:24 -07:00
994556d453 Change from ticks to IQS ID and SC
Change pool to Windows-Service
Build Tests first
Disable Tests
2023-03-09 11:26:07 -07:00
8040a7c6b5 Better data (BioRad)
EC / IFX
FromBody bug fix
Made ID optional and are get all files now
2023-03-08 12:47:22 -07:00
de048b6842 Removed FromBody 2023-03-08 10:04:15 -07:00
db44756142 DNS Name
Nuget Bump
Path Week Bug
2023-03-07 10:37:17 -07:00
66f9347223 Mixed Content: The page at 2023-03-06 13:13:08 -07:00
a0d0f33c83 Skip tests that don't work in IFX 2023-03-06 12:51:00 -07:00
1712743c46 Added View, Recipe Paramaters and Export 2023-03-06 12:00:24 -07:00
bff76a503a thunder-collection 2023-02-25 12:52:18 -07:00
97c9c3c264 InfinityQSV2 2023-02-25 12:39:34 -07:00
8e15b6a3a5 InfinityQS 2023-02-24 20:34:23 -07:00
f3d199cccb Url.Content publish bug 2023-02-24 11:18:35 -07:00
a25dc93610 Viewer to Server 2023-02-16 15:17:31 -07:00
2052 changed files with 401716 additions and 3780 deletions

View File

@ -1,3 +1,19 @@
[*.md]
end_of_line = crlf
file_header_template = unset
indent_size = 2
indent_style = space
insert_final_newline = false
root = true
tab_width = 2
[*.csproj]
end_of_line = crlf
file_header_template = unset
indent_size = 2
indent_style = space
insert_final_newline = false
root = true
tab_width = 2
[*.cs]
csharp_indent_block_contents = true
csharp_indent_braces = false
@ -13,6 +29,7 @@ csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true
csharp_prefer_braces = false
csharp_prefer_qualified_reference = true:error
csharp_prefer_simple_default_expression = true:warning
csharp_prefer_simple_using_statement = true:warning
csharp_prefer_static_local_function = true:warning
@ -76,16 +93,28 @@ csharp_using_directive_placement = outside_namespace
dotnet_code_quality_unused_parameters = all
dotnet_code_quality_unused_parameters = non_public # IDE0060: Remove unused parameter
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.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.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.CA2254.severity = none # CA2254: The logging message template should not vary between calls to 'LoggerExtensions.LogInformation(ILogger, string?, params object?[])'
dotnet_diagnostic.CS8936.severity = error # Feature 'collection expressions' is not available in C# 10.0. Please use language version 12.0 or greater.
dotnet_diagnostic.IDE0001.severity = warning # IDE0001: Simplify name
dotnet_diagnostic.IDE0004.severity = warning # IDE0004: Cast is redundant.
dotnet_diagnostic.IDE0002.severity = warning # Simplify (member access) - System.Version.Equals("1", "2"); Version.Equals("1", "2");
dotnet_diagnostic.IDE0004.severity = warning # IDE0004: Cast is redundant.
dotnet_diagnostic.IDE0005.severity = warning # Using directive is unnecessary
dotnet_diagnostic.IDE0028.severity = none # IDE0028: Collection initialization can be simplified
dotnet_diagnostic.IDE0031.severity = warning # Use null propagation (IDE0031)
dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed
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.IDE0290.severity = none # Use primary constructor [Distance]csharp(IDE0290)
dotnet_diagnostic.IDE0300.severity = none # IDE0300: Collection initialization can be simplified
dotnet_diagnostic.IDE0301.severity = none #IDE0301: Collection initialization can be simplified
dotnet_diagnostic.IDE0305.severity = none # IDE0305: Collection initialization can be simplified
dotnet_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.symbols = abstract_method

10
.gitignore vendored
View File

@ -52,7 +52,7 @@ BenchmarkDotNet.Artifacts/
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
# **/Properties/launchSettings.json
# StyleCop
StyleCopReport.xml
@ -337,6 +337,12 @@ ASALocalRun/
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/thunder-tests/
# Libman.json
/wwwroot/lib/*
/wwwroot/lib/*
.kanbn
Tests/.kanbn
/Wafer-Counter/.vscode/.UserSecrets/secrets.json

266
.groovy
View File

@ -1,266 +0,0 @@
#!/usr/bin/env groovy
/* groovylint-disable CompileStatic, ConsecutiveStringConcatenation, DuplicateNumberLiteral, DuplicateStringLiteral, LineLength, NestedBlockDepth, NoDef, VariableTypeRequired */
import groovy.transform.Field
@Field String _DDrive = 'D:/'
@Field String _ExePath = '...'
@Field String _NGINXFile = '...'
@Field String _PortNumber = '...'
@Field String _AssemblyName = '...'
@Field String _AgentDevelopment = ''
@Field String _NetVersion = 'net6.0'
@Field String _GitCommitSeven = '...'
@Field String _TargetLocation = '...'
@Field String _FirstBeforePlus = '5000'
@Field String _GitName = 'OI-Metrology'
@Field String _MonARessource = 'OI_Metrology'
@Field String _WorkingDirectoryName = 'IFXApps'
@Field String _DDriveNet = "${_DDrive}${_NetVersion}"
@Field String _AgentStaging = 'messa010ec-ecfisysadmin'
@Field String _AgentProduction = 'messa010ec-ecfisysadmin'
@Field String _CredentialsId = 'Metrology-Username-Password'
@Field String _Company = 'Infineon Technologies Americas Corp.'
@Field String _ProgramFilesDotnet = 'C:/program files/dotnet/dotnet.exe'
pipeline {
agent {
label env.JENKINS_ENVIRONMENT == 'Development' ? _AgentDevelopment : env.JENKINS_ENVIRONMENT == 'Staging' ? _AgentStaging : env.JENKINS_ENVIRONMENT == 'Production' ? _AgentProduction : 'Else'
}
parameters {
string(name: 'MONA_SUFFIX', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? '_IFX' : '_EC', description: 'MonA Suffix')
string(name: 'GIT_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'mestsa003.infineon.com' : 'mestsa07ec.ec.local', description: 'git server')
string(name: 'DEFAULT_FILE_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'messv02ecc1_ec_local' : 'messv02ecc1.ec.local', description: 'Default file server...')
string(name: 'PROJECT_DIRECTORY', defaultValue: 'Archive', description: 'Archive|Viewer')
}
stages {
stage('Git') {
steps {
bat(returnStatus: true, script: 'git init')
bat(returnStatus: true, script: 'git remote add origin \\\\' + params.GIT_SERVER + '\\Git\\' + _GitName + '.git')
bat(returnStatus: true, script: 'git pull origin master')
}
}
stage('Setup') {
steps {
script {
_AssemblyName = "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}"
_GitCommitSeven = '1234567'
// _GitCommitSeven = env.GIT_COMMIT.substring(0, 7)
dir(env.PROJECT_DIRECTORY) {
def files = findFiles(glob: '*.csproj')
if (files.length != 1) {
error("Build failed because couldn't find a *.csproj file")
}
echo """
${files[0].name}
${files[0].path}
${files[0].directory}
${files[0].length}
${files[0].lastModified}
"""
_AssemblyName = files[0].name.split('[.]csproj')[0]
}
_TargetLocation = "\\\\${params.DEFAULT_FILE_SERVER}\\EC_EAFRepository\\${env.JENKINS_ENVIRONMENT}\\DeploymentStorage\\Adaptation_${_AssemblyName}"
withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) {
dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes") {
_NGINXFile = "C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes/${_AssemblyName}.conf"
def files = findFiles(glob: "${_AssemblyName}.conf")
if (files.length != 1) {
writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_FirstBeforePlus}; }")
}
}
}
}
}
}
stage('Read NGINX') {
steps {
script {
String text = readFile(file: _NGINXFile)
String check = text == null ? _FirstBeforePlus : text.split(';')[0]
String[] segments = check.split(':')
if (segments.length != 3) {
_PortNumber = check
}
else {
_PortNumber = (segments[2].toInteger() + 2).toString()
}
_ExePath = "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}/${_AssemblyName}.exe"
}
}
}
stage('Info') {
steps {
// echo "GIT_URL_N - ${env.GIT_URL_N}"
// echo "BRANCH_NAME ${env.BRANCH_NAME}"
// echo "DEPLOY_VERSION ${env.DEPLOY_VERSION}"
// echo "GIT_AUTHOR_NAME ${env.GIT_AUTHOR_NAME}"
// echo "GIT_LOCAL_BRANCH ${env.GIT_LOCAL_BRANCH}"
// echo "GIT_COMMITTER_EMAIL ${env.GIT_COMMITTER_EMAIL}"
// echo "GIT_PREVIOUS_COMMIT ${env.GIT_PREVIOUS_COMMIT}"
// echo "GIT_PREVIOUS_SUCCESSFUL_COMMIT ${env.GIT_PREVIOUS_SUCCESSFUL_COMMIT}"
echo "_AssemblyName ${_AssemblyName}" // ...
echo "_ExePath ${_ExePath}" // ...
echo "_PortNumber ${_PortNumber}" // ...
echo "BUILD_NUMBER ${env.BUILD_NUMBER}" // 11
echo "DEFAULT_FILE_SERVER ${params.DEFAULT_FILE_SERVER}" // 11
echo "GIT_BRANCH ${env.GIT_BRANCH}" // origin/master
echo "GIT_COMMIT ${env.GIT_COMMIT}" // 73b814069f2cf0173a62a8228815a9bc9ba93c41
echo "GIT_SERVER ${params.GIT_SERVER}" // ...
echo "GIT_URL ${env.GIT_URL}" // D:\ProgramData\Git\....git
echo "JENKINS_ENVIRONMENT ${env.JENKINS_ENVIRONMENT}" // 11
echo "JENKINS_URL ${env.JENKINS_URL}" // http://localhost:8080/
echo "JOB_NAME ${env.JOB_NAME}" // ...
echo "PROJECT_DIRECTORY ${env.PROJECT_DIRECTORY}" // ...
echo "WORKSPACE ${env.WORKSPACE}" // D:\.jenkins\_\...
}
}
// stage('Restore') {
// steps {
// bat(returnStatus: true, script: 'dotnet --info')
// }
// }
stage('Safe storage of app secrets') {
steps {
withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) {
dir(env.PROJECT_DIRECTORY) {
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets init')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "Company" "' + _Company + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "ServiceUser" "' + username + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "BuildNumber" "' + env.BUILD_NUMBER + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "GitCommitSeven" "' + _GitCommitSeven + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "Server" "' + params.DEFAULT_FILE_SERVER + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "URLs" "' + 'http://localhost:' + _PortNumber)
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "WorkingDirectoryName" "' + _WorkingDirectoryName + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "MonARessource" "' + _MonARessource + '_' + env.PROJECT_DIRECTORY + env.MONA_SUFFIX + '"')
}
}
}
}
// stage('Core Build (packagemanagement.eu.infineon.com)') {
// steps {
// echo "Build number is ${currentBuild.number}"
// dir(env.PROJECT_DIRECTORY) {
// bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
// 'build --runtime win-x64 --self-contained --verbosity quiet --source ' +
// 'https://packagemanagement.eu.infineon.com:4430/api/v2/')
// }
// }
// }
stage('Core Build') {
steps {
echo "Build number is ${currentBuild.number}"
dir(env.PROJECT_DIRECTORY) {
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'build --runtime win-x64 --self-contained --verbosity quiet')
}
}
}
stage('Commit Id') {
steps {
dir(env.PROJECT_DIRECTORY) {
writeFile(file: 'bin/Debug/' + _NetVersion + "/win-x64/${env.GIT_COMMIT}-${env.BUILD_NUMBER}.txt", text: "${env.GIT_URL}")
}
}
}
// stage('Test') {
// options {
// timeout(time: 10, unit: 'MINUTES')
// }
// steps {
// dir(env.PROJECT_DIRECTORY) {
// bat('dotnet --info')
// }
// }
// }
// stage('Version') {
// steps {
// bat('dotnet --info')
// }
// }
stage('Package') {
steps {
dir(env.PROJECT_DIRECTORY) {
fileOperations([fileZipOperation(folderPath: 'bin/Debug/' + _NetVersion + '/win-x64', outputFolderPath: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-Debug")])
fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*", renameFiles: false, sourceCaptureExpression: '', targetLocation: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-Debug", targetNameExpression: '')])
}
}
}
stage('Publish') {
steps {
dir(env.PROJECT_DIRECTORY) {
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'publish --configuration Release --runtime win-x64 --verbosity quiet ' +
"--self-contained true --p:Version=6.0.202-${_GitCommitSeven}-${env.BUILD_NUMBER} -o " +
'"' + "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}" + '"')
}
}
}
stage('Service') {
steps {
withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) {
bat(returnStatus: true, script: 'sc create "' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '" ' +
'start= delayed-auto DisplayName="' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '" ' +
'binPath= "' + _ExePath + '" ' +
'obj= "' + "${env.USERDOMAIN}\\${username}" + '" password= "' + password + '"')
bat(returnStatus: true, script: 'sc start "' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '"')
}
}
}
stage('Upadate NGINX') {
steps {
writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_PortNumber}; }")
}
}
stage('NGINX Test and Reload') {
steps {
withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) {
dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1") {
script {
int returnStatus = bat(returnStatus: true, script: 'nginx.exe -t')
println("returnStatus ################ ${returnStatus} ####################")
if (returnStatus == 0) {
bat(returnStatus: true, script: 'nginx.exe -s reload')
}
}
}
}
}
}
// stage('Force Fail') {
// steps {
// error("Build failed because of this and that..")
// }
// }
// stage('Copy Files to: file-share') {
// steps {
// dir(env.PROJECT_DIRECTORY + '/bin/Debug/' + _NetVersion + '/win-x64') {
// fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.txt", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')])
// fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.dll", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')])
// fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.exe", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')])
// fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.pdb", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')])
// }
// }
// }
}
post {
always {
dir(env.PROJECT_DIRECTORY + '/bin') {
deleteDir()
}
dir(env.PROJECT_DIRECTORY + '/obj') {
deleteDir()
}
// cleanWs()
}
}
}

53
.vscode/launch.json vendored
View File

@ -5,27 +5,68 @@
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"name": ".NET Core Launch (web)",
"name": ".NET Core Launch (web) - Server",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
"preLaunchTask": "buildServer",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/Archive/bin/Debug/net6.0/win-x64/Archive.dll",
"program": "${workspaceFolder}/Server/bin/Debug/net8.0/win-x64/OI.Metrology.Server.dll",
"args": [],
"cwd": "${workspaceFolder}",
"cwd": "${workspaceFolder}/Server",
"stopAtEntry": false,
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
"pattern": "\\bNow listening on:\\s+(https?://\\S+)",
"uriFormat": "%s/swagger/index.html"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/Views": "${workspaceFolder}/Archive/Views"
"/Views": "${workspaceFolder}/Server/Views"
}
},
{
"name": ".NET Core Attach - Server",
"type": "coreclr",
"request": "attach",
"preLaunchTask": "watchServer",
"processName": "OI.Metrology.Server.exe"
},
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"name": ".NET Core Launch (web) - ClientHub",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "buildClientHub",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/ClientHub/bin/Debug/net7.0/win-x64/OI.Metrology.ClientHub.dll",
"args": [],
"cwd": "${workspaceFolder}/ClientHub",
"stopAtEntry": false,
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)",
"uriFormat": "%s/swagger/index.html"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/Views": "${workspaceFolder}/ClientHub/Views"
}
},
{
"name": ".NET Core Attach - ClientHub",
"type": "coreclr",
"request": "attach",
"preLaunchTask": "watchClientHub",
"processName": "OI.Metrology.ClientHub.exe"
},
{
"name": ".NET Core Attach",
"type": "coreclr",

View File

@ -3,5 +3,7 @@
"files.exclude": {
"**/.git": false
},
"thunder-client.saveToWorkspace": false,
"thunder-client.workspaceRelativePath": ".vscode",
"coverage-gutters.coverageBaseDir": "../.vscode/TestResults/*"
}

193
.vscode/tasks.json vendored
View File

@ -2,40 +2,221 @@
"version": "2.0.0",
"tasks": [
{
"label": "build",
"label": "User Secrets Init",
"command": "dotnet",
"type": "process",
"args": [
"user-secrets",
"-p",
"${workspaceFolder}/Server/OI.Metrology.Server.csproj",
"init"
],
"problemMatcher": "$msCompile"
},
{
"label": "User Secrets Set",
"command": "dotnet",
"type": "process",
"args": [
"user-secrets",
"-p",
"${workspaceFolder}/Server/OI.Metrology.Server.csproj",
"set",
"_Application",
"oi-metrology-viewer.Server"
],
"problemMatcher": "$msCompile"
},
{
"label": "buildServer",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/Archive/Archive.csproj",
"${workspaceFolder}/Server/OI.Metrology.Server.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"label": "buildTests",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/Tests/OI.Metrology.Tests.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"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",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/Archive/Archive.csproj",
"${workspaceFolder}/Server/OI.Metrology.Server.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"label": "testDebug",
"command": "dotnet",
"type": "process",
"args": [
"test",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "testRelease",
"command": "dotnet",
"type": "process",
"args": [
"test",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary",
"-c",
"Release"
],
"problemMatcher": "$msCompile"
},
{
"label": "Format",
"command": "dotnet",
"type": "process",
"args": [
"format",
"--report",
".vscode",
"--verbosity",
"detailed",
"--severity",
"warn"
],
"problemMatcher": "$msCompile"
},
{
"label": "old-watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/Archive/Archive.csproj"
"${workspaceFolder}/Server/OI.Metrology.Server.csproj"
],
"problemMatcher": "$msCompile"
},
{
"label": "watchServer",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"--launch-profile",
"http",
"run",
"--project",
"${workspaceFolder}/Server/OI.Metrology.Server.csproj",
"--verbose"
],
"isBackground": true,
"dependsOn": [
"build"
],
"problemMatcher": {
"fileLocation": "relative",
"pattern": {
"regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$",
"file": 1,
"location": 2,
"severity": 3,
"code": 4,
"message": 5
},
"background": {
"activeOnStart": true,
"beginsPattern": "^.*Shutdown requested.*",
"endsPattern": "^.*Application started.*"
}
}
},
{
"label": "buildClientHub",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "publishClientHub",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "watchClientHub",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"--launch-profile",
"http",
"run",
"--project",
"${workspaceFolder}/ClientHub/OI.Metrology.ClientHub.csproj",
"--verbose"
],
"isBackground": true,
"dependsOn": [
"build"
],
"problemMatcher": {
"fileLocation": "relative",
"pattern": {
"regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$",
"file": 1,
"location": 2,
"severity": 3,
"code": 4,
"message": 5
},
"background": {
"activeOnStart": true,
"beginsPattern": "^.*Shutdown requested.*",
"endsPattern": "^.*Application started.*"
}
}
}
]
}

243
Archive/.editorconfig Normal file
View File

@ -0,0 +1,243 @@
[*.cs]
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents = true
csharp_indent_case_contents_when_block = true
csharp_indent_labels = one_less_than_current
csharp_indent_switch_labels = true
csharp_new_line_before_catch = true
csharp_new_line_before_else = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_open_brace = all
csharp_new_line_between_query_expression_clauses = true
csharp_prefer_braces = false
csharp_prefer_simple_default_expression = true:warning
csharp_prefer_simple_using_statement = true:warning
csharp_prefer_static_local_function = true:warning
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async
csharp_preserve_single_line_blocks = true
csharp_preserve_single_line_statements = false
csharp_space_after_cast = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_after_comma = true
csharp_space_after_dot = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_after_semicolon_in_for_statement = true
csharp_space_around_binary_operators = before_and_after
csharp_space_around_declaration_statements = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_before_comma = false
csharp_space_before_dot = false
csharp_space_before_open_square_brackets = false
csharp_space_before_semicolon_in_for_statement = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_parentheses = false
csharp_space_between_square_brackets = false
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true
csharp_style_allow_embedded_statements_on_same_line_experimental = true
csharp_style_conditional_delegate_call = true
csharp_style_deconstructed_variable_declaration = false
csharp_style_expression_bodied_accessors = when_on_single_line:warning
csharp_style_expression_bodied_constructors = when_on_single_line:warning
csharp_style_expression_bodied_indexers = when_on_single_line:warning
csharp_style_expression_bodied_lambdas = when_on_single_line:warning
csharp_style_expression_bodied_local_functions = when_on_single_line:warning
csharp_style_expression_bodied_methods = when_on_single_line:warning
csharp_style_expression_bodied_operators = when_on_single_line:warning
csharp_style_expression_bodied_properties = when_on_single_line:warning
csharp_style_implicit_object_creation_when_type_is_apparent = true:warning
csharp_style_inlined_variable_declaration = false
csharp_style_namespace_declarations = file_scoped:warning
csharp_style_pattern_local_over_anonymous_function = true:warning
csharp_style_pattern_matching_over_as_with_null_check = true:warning
csharp_style_pattern_matching_over_is_with_cast_check = true:warning
csharp_style_prefer_index_operator = false:warning
csharp_style_prefer_not_pattern = true:warning
csharp_style_prefer_null_check_over_type_check = true
csharp_style_prefer_pattern_matching = true:warning
csharp_style_prefer_range_operator = false:warning
csharp_style_prefer_switch_expression = true:warning
csharp_style_throw_expression = true
csharp_style_unused_value_assignment_preference = discard_variable:warning
csharp_style_unused_value_expression_statement_preference = discard_variable:warning
csharp_style_var_elsewhere = false:warning
csharp_style_var_for_built_in_types = false:warning
csharp_style_var_when_type_is_apparent = false:warning
csharp_using_directive_placement = outside_namespace
dotnet_code_quality_unused_parameters = all
dotnet_code_quality_unused_parameters = non_public # IDE0060: Remove unused parameter
dotnet_code_quality.CAXXXX.api_surface = private, internal
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.CA1834.severity = warning # CA1834: Consider using 'StringBuilder.Append(char)' when applicable
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.IDE0005.severity = warning # Using directive is unnecessary
dotnet_diagnostic.IDE0047.severity = warning # IDE0047: Parentheses can be removed
dotnet_diagnostic.IDE0060.severity = warning # IDE0060: Remove unused parameter
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.symbols = abstract_method
dotnet_naming_rule.class_should_be_pascal_case.severity = warning
dotnet_naming_rule.class_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.class_should_be_pascal_case.symbols = class
dotnet_naming_rule.delegate_should_be_pascal_case.severity = warning
dotnet_naming_rule.delegate_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.delegate_should_be_pascal_case.symbols = delegate
dotnet_naming_rule.enum_should_be_pascal_case.severity = warning
dotnet_naming_rule.enum_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.enum_should_be_pascal_case.symbols = enum
dotnet_naming_rule.event_should_be_pascal_case.severity = warning
dotnet_naming_rule.event_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.event_should_be_pascal_case.symbols = event
dotnet_naming_rule.interface_should_be_begins_with_i.severity = warning
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.method_should_be_pascal_case.severity = warning
dotnet_naming_rule.method_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.method_should_be_pascal_case.symbols = method
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = warning
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.private_method_should_be_pascal_case.severity = warning
dotnet_naming_rule.private_method_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.private_method_should_be_pascal_case.symbols = private_method
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.severity = warning
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.style = private_of_internal_field
dotnet_naming_rule.private_or_internal_field_should_be_private_of_internal_field.symbols = private_or_internal_field
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.severity = warning
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.style = private_of_internal_field
dotnet_naming_rule.private_or_internal_static_field_should_be_private_of_internal_field.symbols = private_or_internal_static_field
dotnet_naming_rule.property_should_be_pascal_case.severity = warning
dotnet_naming_rule.property_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.property_should_be_pascal_case.symbols = property
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.severity = warning
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.style = private_of_internal_field
dotnet_naming_rule.public_or_protected_field_should_be_private_of_internal_field.symbols = public_or_protected_field
dotnet_naming_rule.static_field_should_be_pascal_case.severity = warning
dotnet_naming_rule.static_field_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.static_field_should_be_pascal_case.symbols = static_field
dotnet_naming_rule.static_method_should_be_pascal_case.severity = warning
dotnet_naming_rule.static_method_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.static_method_should_be_pascal_case.symbols = static_method
dotnet_naming_rule.struct_should_be_pascal_case.severity = warning
dotnet_naming_rule.struct_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.struct_should_be_pascal_case.symbols = struct
dotnet_naming_rule.types_should_be_pascal_case.severity = warning
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_style.begins_with_i.capitalization = pascal_case
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.private_of_internal_field.capitalization = pascal_case
dotnet_naming_style.private_of_internal_field.required_prefix = _
dotnet_naming_style.private_of_internal_field.required_suffix =
dotnet_naming_style.private_of_internal_field.word_separator =
dotnet_naming_symbols.abstract_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.abstract_method.applicable_kinds = method
dotnet_naming_symbols.abstract_method.required_modifiers = abstract
dotnet_naming_symbols.class.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.class.applicable_kinds = class
dotnet_naming_symbols.class.required_modifiers =
dotnet_naming_symbols.delegate.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.delegate.applicable_kinds = delegate
dotnet_naming_symbols.delegate.required_modifiers =
dotnet_naming_symbols.enum.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.enum.applicable_kinds = enum
dotnet_naming_symbols.enum.required_modifiers =
dotnet_naming_symbols.event.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.event.applicable_kinds = event
dotnet_naming_symbols.event.required_modifiers =
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.method.applicable_accessibilities = public
dotnet_naming_symbols.method.applicable_kinds = method
dotnet_naming_symbols.method.required_modifiers =
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.required_modifiers =
dotnet_naming_symbols.private_method.applicable_accessibilities = private
dotnet_naming_symbols.private_method.applicable_kinds = method
dotnet_naming_symbols.private_method.required_modifiers =
dotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private, private_protected
dotnet_naming_symbols.private_or_internal_field.applicable_kinds = field
dotnet_naming_symbols.private_or_internal_field.required_modifiers =
dotnet_naming_symbols.private_or_internal_static_field.applicable_accessibilities = internal, private, private_protected
dotnet_naming_symbols.private_or_internal_static_field.applicable_kinds = field
dotnet_naming_symbols.private_or_internal_static_field.required_modifiers = static
dotnet_naming_symbols.property.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.property.applicable_kinds = property
dotnet_naming_symbols.property.required_modifiers =
dotnet_naming_symbols.public_or_protected_field.applicable_accessibilities = public, protected
dotnet_naming_symbols.public_or_protected_field.applicable_kinds = field
dotnet_naming_symbols.public_or_protected_field.required_modifiers =
dotnet_naming_symbols.static_field.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.static_field.applicable_kinds = field
dotnet_naming_symbols.static_field.required_modifiers = static
dotnet_naming_symbols.static_method.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.static_method.applicable_kinds = method
dotnet_naming_symbols.static_method.required_modifiers = static
dotnet_naming_symbols.struct.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.struct.applicable_kinds = struct
dotnet_naming_symbols.struct.required_modifiers =
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.required_modifiers =
dotnet_remove_unnecessary_suppression_exclusions = 0
dotnet_separate_import_directive_groups = false
dotnet_sort_system_directives_first = false
dotnet_style_allow_multiple_blank_lines_experimental = false:warning
dotnet_style_allow_statement_immediately_after_block_experimental = true
dotnet_style_coalesce_expression = true
dotnet_style_collection_initializer = true:warning
dotnet_style_explicit_tuple_names = true:warning
dotnet_style_namespace_match_folder = true
dotnet_style_null_propagation = true:warning
dotnet_style_object_initializer = true:warning
dotnet_style_operator_placement_when_wrapping = beginning_of_line
dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
dotnet_style_predefined_type_for_locals_parameters_members = true
dotnet_style_predefined_type_for_member_access = true
dotnet_style_prefer_auto_properties = true:warning
dotnet_style_prefer_compound_assignment = true:warning
dotnet_style_prefer_conditional_expression_over_assignment = false
dotnet_style_prefer_conditional_expression_over_return = false
dotnet_style_prefer_inferred_anonymous_type_member_names = true:warning
dotnet_style_prefer_inferred_tuple_names = true:warning
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:warning
dotnet_style_prefer_simplified_boolean_expressions = true:warning
dotnet_style_prefer_simplified_interpolation = true
dotnet_style_qualification_for_event = false:error
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false:error
dotnet_style_qualification_for_property = false:error
dotnet_style_readonly_field = true:warning
dotnet_style_require_accessibility_modifiers = for_non_interface_members
end_of_line = crlf
file_header_template = unset
indent_size = 4
indent_style = space
insert_final_newline = false
root = true
tab_width = 4
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1822
# https://github.com/dotnet/aspnetcore/blob/main/.editorconfig
# https://github.com/dotnet/project-system/blob/main/.editorconfig

View File

@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
using System;
using System.IO;
@ -8,13 +8,13 @@ using System.IO;
namespace OI.Metrology.Archive.ApiControllers;
public class AttachmentsController : Controller
{
private readonly IMetrologyRepo _Repo;
private readonly IAttachmentsService _AttachmentsService;
private readonly IMetrologyRepository _MetrologyRepository;
public AttachmentsController(IMetrologyRepo repo, IAttachmentsService attachmentsService)
public AttachmentsController(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService)
{
_Repo = repo;
_AttachmentsService = attachmentsService;
_MetrologyRepository = metrologyRepository;
}
// this endpoint was created in hope that it would make retrieving attachments to display in OpenInsight easier
@ -27,7 +27,7 @@ public class AttachmentsController : Controller
string title,
string filename)
{
ToolType tt = _Repo.GetToolTypeByName(toolTypeName);
ToolType tt = _MetrologyRepository.GetToolTypeByName(toolTypeName);
bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase);

View File

@ -1,17 +1,17 @@
using Microsoft.AspNetCore.Mvc;
namespace OI.Metrology.Archive.ApiContollers;
namespace OI.Metrology.Archive.ApiControllers;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Models.Stateless;
using System.Text.Json;
// this controller is for the Awaiting Dispo functionality
public class AwaitingDispoController : Controller
{
private readonly IMetrologyRepo _Repo;
private readonly IMetrologyRepository _MetrologyRepository;
public AwaitingDispoController(IMetrologyRepo repo) => _Repo = repo;
public AwaitingDispoController(IMetrologyRepository metrologyRepository) => _MetrologyRepository = metrologyRepository;
// returns the data to show in the Awaiting Dispo grid
// marked no-cache, just-in-case since igniteUI automatically adds a query string parameter to prevent caching
@ -21,7 +21,7 @@ public class AwaitingDispoController : Controller
{
var r = new
{
Results = _Repo.GetAwaitingDispo()
Results = _MetrologyRepository.GetAwaitingDisposition()
};
return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
@ -30,7 +30,7 @@ public class AwaitingDispoController : Controller
[HttpPost("/api/awaitingdispo/markasreviewed")]
public IActionResult MarkAsReviewed([FromQuery] long headerid, [FromQuery] int tooltypeid)
{
_ = _Repo.UpdateReviewDate(tooltypeid, headerid, false);
_ = _MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, false);
return Ok();
}
@ -38,7 +38,7 @@ public class AwaitingDispoController : Controller
[HttpPost("/api/awaitingdispo/markasawaiting")]
public IActionResult MarkAsAwaiting([FromQuery] long headerid, [FromQuery] int tooltypeid)
{
if (_Repo.UpdateReviewDate(tooltypeid, headerid, true) <= 1)
if (_MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, true) <= 1)
return Ok();
else
return StatusCode(444);

View File

@ -4,30 +4,30 @@ using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Linq;
using OI.Metrology.Archive.Models;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
using System;
using System.Collections.Generic;
using System.Linq;
namespace OI.Metrology.Archive.ApiContollers;
namespace OI.Metrology.Archive.ApiControllers;
[ApiController]
public class InboundController : ControllerBase
{
private readonly ILogger _Logger;
private readonly IMetrologyRepo _Repo;
private readonly AppSettings _AppSettings;
private readonly IAttachmentsService _AttachmentService;
private readonly IInboundDataService _InboundDataService;
private readonly IMetrologyRepository _MetrologyRepository;
public InboundController(AppSettings appSettings, ILogger<InboundController> logger, IMetrologyRepo repo, IInboundDataService inboundDataService, IAttachmentsService attachmentService)
public InboundController(AppSettings appSettings, ILogger<InboundController> logger, IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, IAttachmentsService attachmentService)
{
_Repo = repo;
_Logger = logger;
_AppSettings = appSettings;
_AttachmentService = attachmentService;
_InboundDataService = inboundDataService;
_MetrologyRepository = metrologyRepository;
}
// this class represents the API response back to the client
@ -35,8 +35,8 @@ public class InboundController : ControllerBase
{
public bool Success { get; set; }
public long HeaderID { get; set; }
public List<string> Errors { get; set; }
public List<string> Warnings { get; set; }
public List<string>? Errors { 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
@ -61,9 +61,9 @@ public class InboundController : ControllerBase
return Unauthorized(r);
}
ToolType toolType = _Repo.GetToolTypeByName(tooltype);
ToolType toolType = _MetrologyRepository.GetToolTypeByName(tooltype);
if (toolType == null)
if (toolType is null)
{
r.Errors.Add("Invalid tool type: " + tooltype);
return BadRequest(r);
@ -71,9 +71,9 @@ public class InboundController : ControllerBase
// get metadata
List<ToolTypeMetadata> metaData = _Repo.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList();
List<ToolTypeMetadata> metaData = _MetrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList();
if (metaData == null)
if (metaData is null)
{
r.Errors.Add("Invalid metadata for tool type: " + tooltype);
return BadRequest(r);
@ -81,12 +81,12 @@ public class InboundController : ControllerBase
// validate fields
if (jsonbody != null)
if (jsonbody is not null)
_InboundDataService.ValidateJSONFields(jsonbody, 0, metaData, r.Errors, r.Warnings);
else
r.Errors.Add("Invalid json");
if (r.Errors.Count == 0)
if (r.Errors.Count == 0 && jsonbody is not null)
{
try
{
@ -118,12 +118,12 @@ public class InboundController : ControllerBase
return Unauthorized("Remote IP is not on allowed list");
}
ToolType toolType = _Repo.GetToolTypeByName(tooltype);
ToolType toolType = _MetrologyRepository.GetToolTypeByName(tooltype);
if (toolType == null)
if (toolType is null)
return BadRequest($"Invalid tool type: {tooltype}");
if (Request.Form == null)
if (Request.Form is null)
return BadRequest($"Invalid form");
if (Request.Form.Files.Count != 1)
@ -147,14 +147,14 @@ public class InboundController : ControllerBase
if (string.IsNullOrWhiteSpace(_AppSettings.InboundApiAllowedIPList))
return true;
System.Net.IPAddress remoteIP = HttpContext.Connection.RemoteIpAddress;
byte[] remoteIPBytes = remoteIP.GetAddressBytes();
System.Net.IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress;
byte[]? remoteIPBytes = remoteIP?.GetAddressBytes();
string[] allowedIPs = _AppSettings.InboundApiAllowedIPList.Split(';');
foreach (string ip in allowedIPs)
{
System.Net.IPAddress parsedIP;
if (System.Net.IPAddress.TryParse(ip, out parsedIP))
System.Net.IPAddress? parsedIP;
if (remoteIPBytes is not null && System.Net.IPAddress.TryParse(ip, out parsedIP))
{
if (parsedIP.GetAddressBytes().SequenceEqual(remoteIPBytes))
return true;

View File

@ -4,11 +4,11 @@ using System;
using System.IO;
using System.Linq;
namespace OI.Metrology.Archive.ApiContollers;
namespace OI.Metrology.Archive.ApiControllers;
using OI.Metrology.Archive.Models;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
using System.Collections.Generic;
using System.Text.Json;
@ -21,15 +21,15 @@ public class ToolTypesController : Controller
// it is named after the /api/tooltypes prefix
// the URL pattern is RESTful and the tool type is the root of every request
private readonly IMetrologyRepo _Repo;
private readonly AppSettings _AppSettings;
private readonly IAttachmentsService _AttachmentsService;
private readonly IMetrologyRepository _MetrologyRepository;
public ToolTypesController(AppSettings appSettings, IMetrologyRepo repo, IAttachmentsService attachmentsService)
public ToolTypesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService)
{
_Repo = repo;
_AppSettings = appSettings;
_AttachmentsService = attachmentsService;
_MetrologyRepository = metrologyRepository;
}
// Get a list of tooltypes, returns just Name and ID
@ -38,7 +38,7 @@ public class ToolTypesController : Controller
{
var r = new
{
Results = _Repo.GetToolTypes().Select(tt => new { tt.ToolTypeName, tt.ID })
Results = _MetrologyRepository.GetToolTypes().Select(tt => new { tt.ToolTypeName, tt.ID })
};
return Json(r, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
@ -48,8 +48,8 @@ public class ToolTypesController : Controller
[HttpGet("/api/tooltypes/{id}")]
public IActionResult GetToolTypeMetadata(int id, string sortby = "")
{
ToolType tt = _Repo.GetToolTypeByID(id);
IEnumerable<ToolTypeMetadata> md = _Repo.GetToolTypeMetadataByToolTypeID(id);
ToolType tt = _MetrologyRepository.GetToolTypeByID(id);
IEnumerable<ToolTypeMetadata> md = _MetrologyRepository.GetToolTypeMetadataByToolTypeID(id);
if (string.Equals(sortby, "grid", StringComparison.OrdinalIgnoreCase))
md = md.OrderBy(f => f.GridDisplayOrder).ToList();
@ -80,7 +80,7 @@ public class ToolTypesController : Controller
{
long totalRecs;
System.Data.DataTable dt = _Repo.GetHeaders(id, datebegin, dateend, page, pagesize, headerid, out totalRecs);
System.Data.DataTable dt = _MetrologyRepository.GetHeaders(id, datebegin, dateend, page, pagesize, headerid, out totalRecs);
var r = new
{
@ -101,7 +101,7 @@ public class ToolTypesController : Controller
{
long totalRecs;
IEnumerable<HeaderCommon> dt = _Repo.GetHeaderTitles(id, page, pagesize, out totalRecs);
IEnumerable<HeaderCommon> dt = _MetrologyRepository.GetHeaderTitles(id, page, pagesize, out totalRecs);
var r = new
{
@ -121,7 +121,7 @@ public class ToolTypesController : Controller
{
var r = new
{
Results = _Repo.GetHeaderFields(id, headerid).Select(x => new { Column = x.Key, x.Value }).ToList()
Results = _MetrologyRepository.GetHeaderFields(id, headerid).Select(x => new { Column = x.Key, x.Value }).ToList()
};
string json = JsonConvert.SerializeObject(r);
@ -137,7 +137,7 @@ public class ToolTypesController : Controller
var r = new
{
Results = _Repo.GetDataSharePoint(id, title)
Results = _MetrologyRepository.GetDataSharePoint(id, title)
};
string json = JsonConvert.SerializeObject(r);
@ -152,7 +152,7 @@ public class ToolTypesController : Controller
var r = new
{
Results = _Repo.GetData(id, headerid)
Results = _MetrologyRepository.GetData(id, headerid)
};
string json = JsonConvert.SerializeObject(r);
@ -168,7 +168,7 @@ public class ToolTypesController : Controller
string filename)
{
ToolType tt = _Repo.GetToolTypeByID(toolTypeId);
ToolType tt = _MetrologyRepository.GetToolTypeByID(toolTypeId);
bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase);
@ -191,7 +191,7 @@ public class ToolTypesController : Controller
public IActionResult OIExport(int toolTypeId, long headerid)
{
// Call the export stored procedure
System.Data.DataSet ds = _Repo.GetOIExportData(toolTypeId, headerid);
System.Data.DataSet ds = _MetrologyRepository.GetOIExportData(toolTypeId, headerid);
try
{
@ -203,7 +203,7 @@ public class ToolTypesController : Controller
if (ds.Tables[0].Rows.Count != 1)
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
if (ds.Tables[1].Rows.Count != 1)
@ -211,9 +211,9 @@ public class ToolTypesController : Controller
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 != null) && (!Convert.IsDBNull(o)))
if ((o is not null) && (!Convert.IsDBNull(o)))
_ = sb.Append(Convert.ToString(o));
_ = sb.Append('\t');
}
@ -221,9 +221,9 @@ public class ToolTypesController : Controller
// The third table has the detail data
foreach (System.Data.DataRow dr in ds.Tables[2].Rows)
{
foreach (object o in dr.ItemArray)
foreach (object? o in dr.ItemArray)
{
if ((o != null) && (!Convert.IsDBNull(o)))
if ((o is not null) && (!Convert.IsDBNull(o)))
_ = sb.Append(Convert.ToString(o));
_ = sb.Append('\t');
}

View File

@ -43,7 +43,8 @@ public class ApiLoggingMiddleware
else
{
// 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,8 +14,8 @@ public class ErrorHandlerController : Controller
public IActionResult Index()
{
IExceptionHandlerFeature error = HttpContext.Features.Get<IExceptionHandlerFeature>();
if (error == null)
IExceptionHandlerFeature? error = HttpContext.Features.Get<IExceptionHandlerFeature>();
if (error is null)
{
return Redirect("~/");
}
@ -24,7 +24,7 @@ public class ErrorHandlerController : Controller
_Logger.LogError("Unhandled exception: " + error.Error.ToString());
dynamic r = new
{
Message = error.Error == null ? "Error" : error.Error.Message
Message = error.Error is null ? "Error" : error.Error.Message
};
return StatusCode(StatusCodes.Status500InternalServerError, r);
}

View File

@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using OI.Metrology.Archive.Models;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.ViewModels;
using System;
using System.Collections.Generic;
@ -17,14 +17,14 @@ public class ExportController : Controller
{
private readonly ILogger _Logger;
private readonly bool _IsTestDatabase;
private readonly IMetrologyRepo _Repo;
private readonly AppSettings _AppSettings;
private readonly IMetrologyRepository _MetrologyRepository;
public ExportController(AppSettings appSettings, ILogger<ExportController> logger, IMetrologyRepo repo)
public ExportController(AppSettings appSettings, ILogger<ExportController> logger, IMetrologyRepository metrologyRepository)
{
_Repo = repo;
_Logger = logger;
_AppSettings = appSettings;
_MetrologyRepository = metrologyRepository;
_IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase);
}
@ -40,7 +40,6 @@ public class ExportController : Controller
{
Export model = new()
{
ToolType = "",
StartTime = DateTime.Now.AddMonths(-1),
EndTime = DateTime.Now
};
@ -53,21 +52,21 @@ public class ExportController : Controller
[Route("/ExportData")]
public ActionResult ExportData(Export model)
{
ToolType toolType = null;
ToolType? toolType = null;
if (string.IsNullOrEmpty(model.ToolType))
ModelState.AddModelError("Exception", "Invalid selection");
else
{
if (model.StartTime > model.EndTime)
ModelState.AddModelError("EndTime", "End time must be after start time");
IEnumerable<ToolType> toolTypes = _Repo.GetToolTypes();
IEnumerable<ToolType> toolTypes = _MetrologyRepository.GetToolTypes();
toolType = toolTypes.Where(tt => tt.ID.ToString() == model.ToolType).SingleOrDefault();
if (toolType is null)
ModelState.AddModelError("ToolType", "Invalid selection");
else if (string.IsNullOrWhiteSpace(toolType.ExportSPName))
ModelState.AddModelError("ToolType", "Tool type is not exportable");
}
if (ModelState.IsValid)
if (ModelState.IsValid && toolType?.ToolTypeName is not null && toolType.ExportSPName is not null)
{
try
{
@ -94,7 +93,7 @@ public class ExportController : Controller
string fileName = string.Format("Export_{0}_{1:yyyyMMddHHmm}_to_{2:yyyyMMddHHmm}.csv", toolTypeName, startTime, endTime);
StringBuilder sb = new();
System.Data.DataTable dt = _Repo.ExportData(spName, startTime, endTime);
System.Data.DataTable dt = _MetrologyRepository.ExportData(spName, startTime, endTime);
_ = sb.AppendLine(GetColumnHeaders(dt));
@ -115,10 +114,13 @@ public class ExportController : Controller
{
if (i > 0)
_ = r.Append(',');
object v = dr[i];
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();
}

View File

@ -1,11 +1,11 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using OI.Metrology.Archive.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.ViewModels;
using System;
using System.Collections.Generic;
using IO = System.IO;
namespace OI.Metrology.Archive.Controllers;
@ -13,12 +13,12 @@ public class PagesController : Controller
{
private readonly bool _IsTestDatabase;
private readonly IRdsMaxRepo _RdsMaxRepo;
private readonly IMetrologyRepo _MetrologyRepo;
private readonly IMetrologyRepository _MetrologyRepo;
public PagesController(AppSettings appSettings, IMetrologyRepo metrologyRepo, IRdsMaxRepo rdsMaxRepo)
public PagesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IRdsMaxRepo rdsMaxRepo)
{
_RdsMaxRepo = rdsMaxRepo;
_MetrologyRepo = metrologyRepo;
_MetrologyRepo = metrologyRepository;
_IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase);
}
@ -68,50 +68,6 @@ public class PagesController : Controller
public IActionResult Crash() =>
throw new Exception("Test unhandled exception");
[HttpGet]
[Route("/Step1")]
[Route("/Metrology/Step1")]
public IActionResult Step1(string mod = "", string equipment = "", string layer = "", string zone = "", string rds = "", string initials = "")
{
string directory = "D:/Tmp/Metrology";
if (!IO.Directory.Exists(directory))
_ = IO.Directory.CreateDirectory(directory);
string[] model = new string[] { mod, equipment, layer, zone, rds, initials };
if (!string.IsNullOrEmpty(initials))
IO.File.WriteAllLines(IO.Path.Combine(directory, $"{DateTime.Now.Ticks}-{initials}.rsv"), model);
return View(model);
}
[HttpGet]
[Route("/Step2")]
[Route("/Metrology/Step2")]
public IActionResult Step2(string mod) =>
View(new string[] { mod });
[HttpGet]
[Route("/Step3")]
[Route("/Metrology/Step3")]
public IActionResult Step3(string mod, string equipment) =>
View(new string[] { mod, equipment });
[HttpGet]
[Route("/Step4")]
[Route("/Metrology/Step4")]
public IActionResult Step4(string mod, string equipment, string layer) =>
View(new string[] { mod, equipment, layer });
[HttpGet]
[Route("/Step5")]
[Route("/Metrology/Step5")]
public IActionResult Step5(string mod, string equipment, string layer, string zone) =>
View(new string[] { mod, equipment, layer, zone });
[HttpGet]
[Route("/Step6")]
[Route("/Metrology/Step6")]
public IActionResult Step6(string mod, string equipment, string layer, string zone, string rds) =>
View(new string[] { mod, equipment, layer, zone, rds });
[HttpGet]
[Route("/RdsMax")]
[Route("/Metrology/RdsMax")]

View File

@ -1,61 +1,24 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace OI.Metrology.Archive.Models;
public class AppSettings
public record AppSettings(string ApiLoggingContentTypes,
string ApiLoggingPathPrefixes,
string ApiLogPath,
string AttachmentPath,
string BuildNumber,
string Company,
string ConnectionString,
string GitCommitSeven,
string InboundApiAllowedIPList,
string MonAResource,
string MonASite,
string Oi2SqlConnectionString,
string OIExportPath,
string URLs,
string WorkingDirectoryName)
{
public string ApiLoggingContentTypes { init; get; }
public string ApiLoggingPathPrefixes { init; get; }
public string ApiLogPath { init; get; }
public string AttachmentPath { init; get; }
public string BuildNumber { init; get; }
public string Company { init; get; }
public string ConnectionString { init; get; }
public string GitCommitSeven { init; get; }
public string InboundApiAllowedIPList { init; get; }
public string MonAResource { init; get; }
public string MonASite { init; get; }
public string OIExportPath { init; get; }
public string Oi2SqlConnectionString { init; get; }
public string URLs { init; get; }
public string WorkingDirectoryName { init; get; }
[JsonConstructor]
public AppSettings(string apiLoggingContentTypes,
string apiLoggingPathPrefixes,
string apiLogPath,
string attachmentPath,
string buildNumber,
string company,
string connectionString,
string gitCommitSeven,
string inboundApiAllowedIPList,
string monAResource,
string monASite,
string oi2SqlConnectionString,
string oiExportPath,
string urls,
string workingDirectoryName)
{
ApiLoggingContentTypes = apiLoggingContentTypes;
ApiLoggingPathPrefixes = apiLoggingPathPrefixes;
ApiLogPath = apiLogPath;
AttachmentPath = attachmentPath;
BuildNumber = buildNumber;
Company = company;
ConnectionString = connectionString;
GitCommitSeven = gitCommitSeven;
InboundApiAllowedIPList = inboundApiAllowedIPList;
MonAResource = monAResource;
MonASite = monASite;
Oi2SqlConnectionString = oi2SqlConnectionString;
OIExportPath = oiExportPath;
URLs = urls;
WorkingDirectoryName = workingDirectoryName;
}
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });

View File

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

View File

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

View File

@ -8,12 +8,14 @@
<PropertyGroup>
<ImplicitUsings>disable</ImplicitUsings>
<IsPackable>false</IsPackable>
<LangVersion>10.0</LangVersion>
<Nullable>disable</Nullable>
<Nullable>enable</Nullable>
<OutputType>Exe</OutputType>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<InternalsVisibleTo Include="Tests" />
</ItemGroup>
<ItemGroup>
<Compile Remove="logs\**" />
<Content Remove="logs\**" />
@ -24,30 +26,19 @@
<Content Remove="compilerconfig.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.123" />
<PackageReference Include="Dapper" Version="2.1.24" />
<PackageReference Include="EntityFramework" Version="6.4.4" />
<PackageReference Include="jQuery" Version="3.6.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="jQuery" Version="3.7.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.1" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Serilog.AspNetCore" Version="5.0.0" />
<PackageReference Include="Serilog.AspNetCore.Ingestion" Version="1.0.0-dev-00021" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.0.1" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\Shared.csproj" />
<ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="moves\" />

View File

@ -9,9 +9,9 @@ using OI.Metrology.Archive.Models;
using OI.Metrology.Archive.Repositories;
using OI.Metrology.Archive.Services;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Services;
using Serilog;
using System;
using System.IO;
using System.Reflection;
@ -25,7 +25,7 @@ public class Program
{
string webRootPath;
Assembly assembly = Assembly.GetExecutingAssembly();
string assemblyName = assembly.GetName()?.Name;
string? assemblyName = assembly.GetName()?.Name;
if (string.IsNullOrEmpty(assemblyName))
throw new Exception();
string baseAssemblyName = assemblyName.Split('.')[0];
@ -46,30 +46,26 @@ public class Program
public static int Main(string[] args)
{
LoggerConfiguration loggerConfiguration = new();
ILogger<Program>? logger = null;
(string assemblyName, WebApplicationOptions _) = Get(args);
WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args);
_ = webApplicationBuilder.Configuration.AddUserSecrets<Program>();
AppSettings appSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration);
if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName))
AppSettings _AppSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration);
if (string.IsNullOrEmpty(_AppSettings.WorkingDirectoryName))
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);
_ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, webApplicationBuilder.Configuration);
_ = SerilogHostBuilderExtensions.UseSerilog(webApplicationBuilder.Host);
Log.Logger = loggerConfiguration.CreateLogger();
Serilog.ILogger log = Log.ForContext<Program>();
try
{
_ = webApplicationBuilder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true);
_ = webApplicationBuilder.Services.AddControllersWithViews();
_ = new MetrologyRepo(new SQLDbConnectionFactory(appSettings), null);
_ = new MetrologyRepository(new SQLDbConnectionFactory(_AppSettings), null);
_ = webApplicationBuilder.Services.AddDistributedMemoryCache();
_ = webApplicationBuilder.Services.AddMemoryCache();
_ = webApplicationBuilder.Services.AddSingleton<AppSettings, AppSettings>(_ => appSettings);
_ = webApplicationBuilder.Services.AddSingleton<AppSettings, AppSettings>(_ => _AppSettings);
_ = webApplicationBuilder.Services.AddScoped<IAttachmentsService, AttachmentsService>();
_ = webApplicationBuilder.Services.AddScoped<IInboundDataService, InboundDataService>();
_ = webApplicationBuilder.Services.AddScoped<IMetrologyRepo, MetrologyRepo>();
_ = webApplicationBuilder.Services.AddScoped<IMetrologyRepository, MetrologyRepository>();
_ = webApplicationBuilder.Services.AddScoped<IRdsMaxRepo, RdsMaxRepo>();
_ = webApplicationBuilder.Services.AddSingleton<IDbConnectionFactory, SQLDbConnectionFactory>();
_ = webApplicationBuilder.Services.AddSwaggerGen();
@ -83,13 +79,16 @@ public class Program
if (WindowsServiceHelpers.IsWindowsService())
{
_ = webApplicationBuilder.Services.AddSingleton<IHostLifetime, WindowsServiceLifetime>();
#pragma warning disable CA1416
_ = webApplicationBuilder.Logging.AddEventLog(settings =>
{
if (string.IsNullOrEmpty(settings.SourceName))
settings.SourceName = webApplicationBuilder.Environment.ApplicationName;
});
#pragma warning restore
}
WebApplication webApplication = webApplicationBuilder.Build();
logger = webApplication.Services.GetRequiredService<ILogger<Program>>();
if (!webApplicationBuilder.Environment.IsDevelopment())
{
_ = webApplication.UseExceptionHandler("/Error");
@ -97,7 +96,7 @@ public class Program
}
else
{
if (string.IsNullOrEmpty(appSettings.URLs))
if (string.IsNullOrEmpty(_AppSettings.URLs))
{
Environment.ExitCode = -1;
webApplication.Lifetime.StopApplication();
@ -105,27 +104,22 @@ public class Program
_ = webApplication.UseSwagger();
_ = 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.UseStaticFiles();
_ = webApplication.UseSession();
_ = webApplication.UseHttpsRedirection();
_ = webApplication.UseMiddleware<ApiLoggingMiddleware>();
_ = webApplication.MapControllers();
log.Information("Starting Web Application");
logger.LogInformation("Starting Web Application");
webApplication.Run();
return 0;
}
catch (Exception ex)
{
log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
try
{ logger?.LogCritical(ex, "Host terminated unexpectedly"); }
catch (Exception) { }
throw;
}
}

View File

@ -2,6 +2,7 @@
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json.Linq;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories;
using System;
using System.Collections.Generic;
@ -12,12 +13,14 @@ using System.Transactions;
namespace OI.Metrology.Archive.Repositories;
public class MetrologyRepo : IMetrologyRepo
#nullable disable
public class MetrologyRepository : IMetrologyRepository
{
private readonly IDbConnectionFactory _DBConnectionFactory;
private readonly IMemoryCache _Cache;
public MetrologyRepo(IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache)
public MetrologyRepository(IDbConnectionFactory dbConnectionFactory, IMemoryCache memoryCache)
{
_DBConnectionFactory = dbConnectionFactory;
_Cache = memoryCache;
@ -28,20 +31,6 @@ public class MetrologyRepo : IMetrologyRepo
protected DbProviderFactory GetDbProviderFactory(IDbConnection conn) =>
DbProviderFactories.GetFactory(conn.GetType().Namespace);
public bool IsTestDatabase()
{
int c = 0;
using (DbConnection conn = GetDbConnection())
{
c = conn.Query<int>(
"SELECT COUNT(*) " +
"FROM Configuration " +
"WHERE KeyName = 'TestDatabase' " +
"AND ValueString = '1'").FirstOrDefault();
}
return c > 0;
}
public TransactionScope StartTransaction() => new();
protected void CacheItem(string key, object v)
@ -136,10 +125,10 @@ public class MetrologyRepo : IMetrologyRepo
// build field map
foreach (ToolTypeMetadata f in fields)
{
if ((f.ApiName != null) && f.ApiName.Contains('\\'))
if ((f.ApiName is not null) && f.ApiName.Contains('\\'))
{
string n = f.ApiName.Split('\\')[0].Trim().ToUpper();
if (containerField == null)
if (containerField is null)
containerField = n;
else if (!string.Equals(containerField, n))
throw new Exception("Only one container field is allowed");
@ -153,7 +142,7 @@ public class MetrologyRepo : IMetrologyRepo
}
}
if (containerField == null)
if (containerField is null)
{
// No container field, just insert a single row
@ -164,7 +153,7 @@ public class MetrologyRepo : IMetrologyRepo
// Find the container field in the json
JProperty contJP = jsonrow.Children<JProperty>().Where(c => string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault();
if ((contJP != null) && (contJP.Value is JArray array))
if ((contJP is not null) && (contJP.Value is JArray array))
{
JArray contRows = array;
@ -227,14 +216,13 @@ public class MetrologyRepo : IMetrologyRepo
parmnumber += 1;
object sqlValue = ((JValue)jp.Value).Value;
if (sqlValue == null)
sqlValue = DBNull.Value;
sqlValue ??= DBNull.Value;
AddParameter(cmd, parmname, sqlValue);
}
}
if ((containerrow != null) && (containerFieldmap != null))
if ((containerrow is not null) && (containerFieldmap is not null))
{
foreach (JProperty jp in containerrow.Children<JProperty>())
@ -251,8 +239,7 @@ public class MetrologyRepo : IMetrologyRepo
parmnumber += 1;
object sqlValue = ((JValue)jp.Value).Value;
if (sqlValue == null)
sqlValue = DBNull.Value;
sqlValue ??= DBNull.Value;
AddParameter(cmd, parmname, sqlValue);
}
@ -266,7 +253,7 @@ public class MetrologyRepo : IMetrologyRepo
cmd.CommandText = columns.TrimEnd(',') + parms.TrimEnd(',') + ";SELECT SCOPE_IDENTITY();";
object o = cmd.ExecuteScalar();
if ((o == null) || Convert.IsDBNull(o))
if ((o is null) || Convert.IsDBNull(o))
throw new Exception("Unexpected query result");
return Convert.ToInt64(o);
}
@ -306,7 +293,7 @@ public class MetrologyRepo : IMetrologyRepo
{
if (!firstField)
_ = sb.Append(',');
if (f.GridAttributes != null && f.GridAttributes.Contains("isNull"))
if (f.GridAttributes is not null && f.GridAttributes.Contains("isNull"))
{
_ = sb.AppendFormat("{0}", "ISNULL(" + f.ColumnName + ", '')[" + f.ColumnName + "]");
}
@ -323,13 +310,9 @@ public class MetrologyRepo : IMetrologyRepo
public DataTable GetHeaders(int toolTypeId, DateTime? startTime, DateTime? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId);
if (md == null)
throw new Exception("Invalid tool type metadata");
IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId) ?? throw new Exception("Invalid tool type metadata");
DataTable dt = new();
@ -419,13 +402,9 @@ public class MetrologyRepo : IMetrologyRepo
// Go Here Next
public DataTable GetData(int toolTypeId, long headerid)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId);
if (md == null)
throw new Exception("Invalid tool type metadata");
IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId) ?? throw new Exception("Invalid tool type metadata");
DataTable dt = new();
@ -530,13 +509,9 @@ public class MetrologyRepo : IMetrologyRepo
}
public DataTable GetDataSharePoint(int toolTypeId, string headerid)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId);
if (md == null)
throw new Exception("Invalid tool type metadata");
IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId) ?? throw new Exception("Invalid tool type metadata");
DataTable dt = new();
@ -625,9 +600,7 @@ public class MetrologyRepo : IMetrologyRepo
}
public Guid GetHeaderAttachmentID(int toolTypeId, long headerId)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
using DbConnection conn = GetDbConnection();
string sql =
@ -638,9 +611,7 @@ public class MetrologyRepo : IMetrologyRepo
public Guid GetDataAttachmentID(int toolTypeId, long headerId, string title)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
using DbConnection conn = GetDbConnection();
string sql =
@ -657,9 +628,7 @@ public class MetrologyRepo : IMetrologyRepo
public DataSet GetOIExportData(int toolTypeId, long headerid)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
if (string.IsNullOrWhiteSpace(tt.OIExportSPName))
throw new Exception("OpenInsight export not available for " + tt.ToolTypeName);
@ -684,28 +653,29 @@ public class MetrologyRepo : IMetrologyRepo
return ds;
}
public IEnumerable<HeaderCommon> GetHeaderTitles(int toolTypeId, int? pageNo, int? pageSize, out long totalRecords)
public HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
if (toolTypeId is null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId.Value) ?? throw new Exception("Invalid tool type ID");
DbConnection conn = GetDbConnection();
using (conn)
{
string sql = $"SELECT ID, InsertDate, AttachmentID, Title, [Date] FROM {tt.HeaderTableName} ORDER BY [Date] DESC ";
IEnumerable<HeaderCommon> headers;
HeaderCommon[] headers;
if (pageNo.HasValue && pageSize.HasValue)
{
sql += "OFFSET @PageNum * @PageSize ROWS FETCH NEXT @PageSize ROWS ONLY";
headers = conn.Query<HeaderCommon>(sql, param: new { PageNum = pageNo.Value, PageSize = pageSize.Value }).ToList();
headers = conn.Query<HeaderCommon>(sql, param: new { PageNum = pageNo.Value, PageSize = pageSize.Value }).ToArray();
}
else
{
headers = conn.Query<HeaderCommon>(sql).ToList();
headers = conn.Query<HeaderCommon>(sql).ToArray();
}
sql = $"SELECT COUNT(*) FROM [{tt.HeaderTableName}] ";
@ -718,13 +688,9 @@ public class MetrologyRepo : IMetrologyRepo
public IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId);
if (md == null)
throw new Exception("Invalid tool type metadata");
IEnumerable<ToolTypeMetadata> md = GetToolTypeMetadataByToolTypeID(toolTypeId) ?? throw new Exception("Invalid tool type metadata");
List<KeyValuePair<string, string>> r = new();
@ -751,10 +717,10 @@ public class MetrologyRepo : IMetrologyRepo
foreach (ToolTypeMetadata m in md.Where(m => m.Header == true && m.TableDisplayOrder > 0).OrderBy(m => m.TableDisplayOrder))
{
string v = "";
if (dr != null)
if (dr is not null)
{
object o = dr[m.ColumnName];
if (o != null && !Convert.IsDBNull(o))
if (o is not null && !Convert.IsDBNull(o))
v = Convert.ToString(o);
}
KeyValuePair<string, string> kvp = new(m.DisplayTitle, v);
@ -764,17 +730,15 @@ public class MetrologyRepo : IMetrologyRepo
return r;
}
public IEnumerable<AwaitingDispo> GetAwaitingDispo()
public IEnumerable<AwaitingDisposition> GetAwaitingDisposition()
{
using DbConnection conn = GetDbConnection();
return conn.Query<AwaitingDispo>("GetAwaitingDispo", commandType: CommandType.StoredProcedure);
return conn.Query<AwaitingDisposition>("GetAwaitingDispo", commandType: CommandType.StoredProcedure);
}
// Jonathan changed this to remove the reviewDate update on the database.
public int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
using DbConnection conn = GetDbConnection();
if (clearDate)
@ -793,9 +757,7 @@ public class MetrologyRepo : IMetrologyRepo
public Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
using DbConnection conn = GetDbConnection();
string sql =
@ -805,9 +767,7 @@ public class MetrologyRepo : IMetrologyRepo
public Guid GetDataAttachmentIDByTitle(int toolTypeId, string title)
{
ToolType tt = GetToolTypeByID(toolTypeId);
if (tt == null)
throw new Exception("Invalid tool type ID");
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
using DbConnection conn = GetDbConnection();
string sql =
@ -815,8 +775,8 @@ public class MetrologyRepo : IMetrologyRepo
return conn.ExecuteScalar<Guid>(sql, param: new { Title = title });
}
string IMetrologyRepo.GetHeaderInsertDate(int toolTypeId, long headerId) => throw new NotImplementedException();
void IMetrologyRepo.SetHeaderDirName(string tableName, long headerId, string dateDir) => throw new NotImplementedException();
string IMetrologyRepo.GetDataInsertDate(int toolTypeId, long headerId, string title) => throw new NotImplementedException();
void IMetrologyRepo.SetDataDirName(string tableName, long headerId, string title, string dateDir) => throw new NotImplementedException();
string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId) => throw new NotImplementedException();
void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir) => throw new NotImplementedException();
string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title) => throw new NotImplementedException();
void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir) => throw new NotImplementedException();
}

View File

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

View File

@ -6,13 +6,15 @@ using System.Data.SqlClient;
namespace OI.Metrology.Archive.Repositories;
#nullable disable
public class SQLDbConnectionFactory : IDbConnectionFactory
{
private readonly AppSettings _AppSettings;
public SQLDbConnectionFactory(AppSettings appSettings) => _AppSettings = appSettings;
public DbConnection GetDbConnection()
public DbConnection GetDbConnection(bool? useOI2Sql = null)
{
DbProviderFactories.RegisterFactory(
typeof(SqlConnection).Namespace,

View File

@ -4,29 +4,31 @@ using System.IO;
namespace OI.Metrology.Archive.Services;
#nullable disable
using OI.Metrology.Archive.Models;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
using System.Data.SqlClient;
public class AttachmentsService : IAttachmentsService
{
private readonly IMetrologyRepo _Repo;
private readonly AppSettings _AppSettings;
private readonly IMetrologyRepository _MetrologyRepository;
public AttachmentsService(AppSettings appSettings, IMetrologyRepo repo)
public AttachmentsService(AppSettings appSettings, IMetrologyRepository metrologyRepository)
{
_Repo = repo;
_AppSettings = appSettings;
_MetrologyRepository = metrologyRepository;
}
protected Stream GetAttachmentStream(string tableName, Guid attachmentId, string filename)
{
if (attachmentId.Equals(Guid.Empty))
throw new Exception("No attachments found");
DateTime insertDate = Convert.ToDateTime(_Repo.GetAttachmentInsertDateByGUID(tableName, attachmentId));
DateTime insertDate = Convert.ToDateTime(_MetrologyRepository.GetAttachmentInsertDateByGUID(tableName, attachmentId));
int year = insertDate.Year;
DateTime d = insertDate;
CultureInfo cul = CultureInfo.CurrentCulture;
@ -63,7 +65,7 @@ public class AttachmentsService : IAttachmentsService
public Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename)
{
if (toolType == null)
if (toolType is null)
throw new Exception("Invalid tool type");
string queryString = "SELECT * FROM " + toolType.DataTableName + " WHERE AttachmentId = @attachmentId";
@ -72,7 +74,7 @@ public class AttachmentsService : IAttachmentsService
queryString = "SELECT * FROM " + toolType.HeaderTableName + " WHERE AttachmentId = '" + title + "'";
}
DateTime SearchDate = new();
string connectionString = @"Server=messv01ec.ec.local\PROD1,53959;Database=Metrology_Archive;Integrated Security=True";
string connectionString = @"Server=messqlec1.infineon.com\PROD1,53959;Database=Metrology_Archive;Integrated Security=True";
using (SqlConnection connection = new(connectionString))
{
SqlCommand command = new(queryString, connection);
@ -103,19 +105,19 @@ public class AttachmentsService : IAttachmentsService
if (header)
{
tableName = toolType.HeaderTableName;
attachmentId = _Repo.GetHeaderAttachmentIDByTitle(toolType.ID, title);
attachmentId = _MetrologyRepository.GetHeaderAttachmentIDByTitle(toolType.ID, title);
}
else
{
tableName = toolType.DataTableName;
attachmentId = _Repo.GetDataAttachmentIDByTitle(toolType.ID, title);
attachmentId = _MetrologyRepository.GetDataAttachmentIDByTitle(toolType.ID, title);
}
return GetAttachmentStream(tableName, attachmentId, filename);
}
public Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename)
{
if (toolType == null)
if (toolType is null)
throw new Exception("Invalid tool type");
string tableName;
if (header)
@ -126,7 +128,7 @@ public class AttachmentsService : IAttachmentsService
}
public Stream GetAttachmentStreamByAttachmentIdArchive(ToolType toolType, bool header, Guid attachmentId, string filename)
{
if (toolType == null)
if (toolType is null)
throw new Exception("Invalid tool type");
string tableName;
if (header)
@ -139,21 +141,21 @@ public class AttachmentsService : IAttachmentsService
private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, Microsoft.AspNetCore.Http.IFormFile uploadedFile)
{
if (toolType == null)
if (toolType is null)
throw new Exception("Invalid tool type");
using System.Transactions.TransactionScope trans = _Repo.StartTransaction();
using System.Transactions.TransactionScope trans = _MetrologyRepository.StartTransaction();
Guid attachmentId = Guid.Empty;
string tableName = "";
if (string.IsNullOrWhiteSpace(dataUniqueId))
{
attachmentId = _Repo.GetHeaderAttachmentID(toolType.ID, headerId);
attachmentId = _MetrologyRepository.GetHeaderAttachmentID(toolType.ID, headerId);
tableName = toolType.HeaderTableName;
}
else
{
attachmentId = _Repo.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId);
attachmentId = _MetrologyRepository.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId);
tableName = toolType.DataTableName;
}
if (Equals(attachmentId, Guid.Empty))
@ -175,4 +177,7 @@ public class AttachmentsService : IAttachmentsService
SaveAttachment(toolType, headerId, dataUniqueId, filename, formFile);
}
string IAttachmentsService.GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, string attachmentPath, int toolTypeId, long headerId) =>
throw new NotImplementedException();
}

View File

@ -1,6 +1,6 @@
using Newtonsoft.Json.Linq;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
using System;
using System.Collections.Generic;
@ -8,11 +8,13 @@ using System.Linq;
namespace OI.Metrology.Archive.Services;
#nullable disable
public class InboundDataService : IInboundDataService
{
private readonly IMetrologyRepo _Repo;
private readonly IMetrologyRepository _MetrologyRepository;
public InboundDataService(IMetrologyRepo repo) => _Repo = repo;
public InboundDataService(IMetrologyRepository metrologyRepository) => _MetrologyRepository = metrologyRepository;
public long DoSQLInsert(JToken jsonbody, ToolType toolType, List<ToolTypeMetadata> metaData)
{
@ -37,11 +39,11 @@ public class InboundDataService : IInboundDataService
long headerId = 0;
using (System.Transactions.TransactionScope transScope = _Repo.StartTransaction())
using (System.Transactions.TransactionScope transScope = _MetrologyRepository.StartTransaction())
{
try
{
_Repo.PurgeExistingData(toolType.ID, uniqueId);
_MetrologyRepository.PurgeExistingData(toolType.ID, uniqueId);
}
catch (Exception ex)
{
@ -50,7 +52,7 @@ public class InboundDataService : IInboundDataService
try
{
headerId = _Repo.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName);
headerId = _MetrologyRepository.InsertToolDataJSON(jsonbody, -1, metaData, toolType.HeaderTableName);
}
catch (Exception ex)
{
@ -60,11 +62,11 @@ public class InboundDataService : IInboundDataService
int detailrow = 1;
try
{
if (detailsArray != null)
if (detailsArray is not null)
{
foreach (JToken detail in detailsArray)
{
_ = _Repo.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName);
_ = _MetrologyRepository.InsertToolDataJSON(detail, headerId, metaData, toolType.DataTableName);
detailrow += 1;
}
}
@ -133,7 +135,7 @@ public class InboundDataService : IInboundDataService
if (jp.First is JArray array)
detailsArray = array;
else if ((jp.First is JValue value) && (value.Value == null))
else if ((jp.First is JValue value) && (value.Value is null))
detailsArray = null;
else
errors.Add("Invalid details field");
@ -169,7 +171,7 @@ public class InboundDataService : IInboundDataService
}
// if a Details container if found, process it by recursion
if (detailsArray != null)
if (detailsArray is not null)
{
int i = 1;
foreach (JToken detail in detailsArray)
@ -189,7 +191,7 @@ public class InboundDataService : IInboundDataService
{
// get the json data for this container field, ex: Points
JProperty contJP = jsonbody.Children<JProperty>().Where(jp => string.Equals(jp.Name, containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault();
if ((contJP != null) && (contJP.Value is JArray array))
if ((contJP is not null) && (contJP.Value is JArray array))
{
JArray contJPArray = array;

View File

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

View File

@ -3,10 +3,10 @@
"ApiLoggingContentTypes": "application/json",
"ApiLoggingPathPrefixes": "/api/inbound",
"ApiLogPath": "D:\\Metrology\\MetrologyAPILogs",
"AttachmentPath": "\\\\messv02ecc1.ec.local\\EC_Metrology_Si\\MetrologyAttachments",
"AttachmentPath": "\\\\mesfs.infineon.com\\EC_Metrology_Si\\MetrologyAttachments",
"BuildNumber": "1",
"Company": "Infineon Technologies Americas Corp.",
"ConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Integrated Security=True;Initial Catalog=Metrology_Archive;",
"ConnectionString": "Data Source=messqlec1.infineon.com\\PROD1,53959;Integrated Security=True;Initial Catalog=Metrology_Archive;",
"GitCommitSeven": "1234567",
"Logging": {
"LogLevel": {
@ -19,7 +19,7 @@
"InboundApiAllowedIPList": "",
"MonAResource": "OI_Metrology_Archive_IFX",
"MonASite": "auc",
"Oi2SqlConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;",
"Oi2SqlConnectionString": "Data Source=messqlec1.infineon.com\\PROD1,53959;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;",
"OIExportPath": "\\\\openinsight-db-srv.na.infineon.com\\apps\\Metrology\\Data",
"Serilog": {
"Using": [

View File

@ -3,10 +3,10 @@
"ApiLoggingContentTypes": "application/json",
"ApiLoggingPathPrefixes": "/api/inbound",
"ApiLogPath": "D:\\Metrology\\MetrologyAPILogs",
"AttachmentPath": "\\\\messv02ecc1.ec.local\\EC_Metrology_Si\\MetrologyAttachments",
"AttachmentPath": "\\\\mesfs.infineon.com\\EC_Metrology_Si\\MetrologyAttachments",
"BuildNumber": "1",
"Company": "Infineon Technologies Americas Corp.",
"ConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Integrated Security=True;Initial Catalog=Metrology_Archive;",
"ConnectionString": "Data Source=messqlec1.infineon.com\\PROD1,53959;Integrated Security=True;Initial Catalog=Metrology_Archive;",
"GitCommitSeven": "1234567",
"Logging": {
"LogLevel": {
@ -19,7 +19,7 @@
"InboundApiAllowedIPList": "",
"MonAResource": "OI_Metrology_Archive_EC",
"MonASite": "auc",
"Oi2SqlConnectionString": "Data Source=messv01ec.ec.local\\PROD1,53959;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;",
"Oi2SqlConnectionString": "Data Source=messqlec1.infineon.com\\PROD1,53959;Initial Catalog=LSL2SQL;Persist Security Info=True;User ID=srpadmin;Password=0okm9ijn;",
"OIExportPath": "\\\\openinsight-db-srv.na.infineon.com\\apps\\Metrology\\Data",
"Serilog": {
"Using": [

266
Jenkinsfile vendored
View File

@ -1,266 +0,0 @@
#!/usr/bin/env groovy
/* groovylint-disable CompileStatic, ConsecutiveStringConcatenation, DuplicateNumberLiteral, DuplicateStringLiteral, LineLength, NestedBlockDepth, NoDef, VariableTypeRequired */
import groovy.transform.Field
@Field String _DDrive = 'D:/'
@Field String _ExePath = '...'
@Field String _NGINXFile = '...'
@Field String _PortNumber = '...'
@Field String _AssemblyName = '...'
@Field String _AgentDevelopment = ''
@Field String _NetVersion = 'net6.0'
@Field String _GitCommitSeven = '...'
@Field String _TargetLocation = '...'
@Field String _FirstBeforePlus = '5000'
@Field String _GitName = 'OI-Metrology'
@Field String _MonARessource = 'OI_Metrology'
@Field String _WorkingDirectoryName = 'IFXApps'
@Field String _DDriveNet = "${_DDrive}${_NetVersion}"
@Field String _AgentStaging = 'messa010ec-ecfisysadmin'
@Field String _AgentProduction = 'messa010ec-ecfisysadmin'
@Field String _CredentialsId = 'Metrology-Username-Password'
@Field String _Company = 'Infineon Technologies Americas Corp.'
@Field String _ProgramFilesDotnet = 'C:/program files/dotnet/dotnet.exe'
pipeline {
agent {
label env.JENKINS_ENVIRONMENT == 'Development' ? _AgentDevelopment : env.JENKINS_ENVIRONMENT == 'Staging' ? _AgentStaging : env.JENKINS_ENVIRONMENT == 'Production' ? _AgentProduction : 'Else'
}
parameters {
string(name: 'MONA_SUFFIX', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? '_IFX' : '_EC', description: 'MonA Suffix')
string(name: 'GIT_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'mestsa003.infineon.com' : 'mestsa07ec.ec.local', description: 'git server')
string(name: 'DEFAULT_FILE_SERVER', defaultValue: env.JENKINS_ENVIRONMENT == 'Development' ? 'messv02ecc1_ec_local' : 'messv02ecc1.ec.local', description: 'Default file server...')
string(name: 'PROJECT_DIRECTORY', defaultValue: 'Archive', description: 'Archive|Viewer')
}
stages {
// stage('Git') {
// steps {
// bat(returnStatus: true, script: 'git init')
// bat(returnStatus: true, script: 'git remote add origin \\\\' + params.GIT_SERVER + '\\Git\\' + _GitName + '.git')
// bat(returnStatus: true, script: 'git pull origin master')
// }
// }
stage('Setup') {
steps {
script {
_AssemblyName = "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}"
// _GitCommitSeven = '1234567'
_GitCommitSeven = env.GIT_COMMIT.substring(0, 7)
dir(env.PROJECT_DIRECTORY) {
def files = findFiles(glob: '*.csproj')
if (files.length != 1) {
error("Build failed because couldn't find a *.csproj file")
}
echo """
${files[0].name}
${files[0].path}
${files[0].directory}
${files[0].length}
${files[0].lastModified}
"""
_AssemblyName = files[0].name.split('[.]csproj')[0]
}
_TargetLocation = "\\\\${params.DEFAULT_FILE_SERVER}\\EC_EAFRepository\\${env.JENKINS_ENVIRONMENT}\\DeploymentStorage\\Adaptation_${_AssemblyName}"
withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) {
dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes") {
_NGINXFile = "C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1/conf/includes/${_AssemblyName}.conf"
def files = findFiles(glob: "${_AssemblyName}.conf")
if (files.length != 1) {
writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_FirstBeforePlus}; }")
}
}
}
}
}
}
stage('Read NGINX') {
steps {
script {
String text = readFile(file: _NGINXFile)
String check = text == null ? _FirstBeforePlus : text.split(';')[0]
String[] segments = check.split(':')
if (segments.length != 3) {
_PortNumber = check
}
else {
_PortNumber = (segments[2].toInteger() + 2).toString()
}
_ExePath = "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}/${_AssemblyName}.exe"
}
}
}
stage('Info') {
steps {
// echo "GIT_URL_N - ${env.GIT_URL_N}"
// echo "BRANCH_NAME ${env.BRANCH_NAME}"
// echo "DEPLOY_VERSION ${env.DEPLOY_VERSION}"
// echo "GIT_AUTHOR_NAME ${env.GIT_AUTHOR_NAME}"
// echo "GIT_LOCAL_BRANCH ${env.GIT_LOCAL_BRANCH}"
// echo "GIT_COMMITTER_EMAIL ${env.GIT_COMMITTER_EMAIL}"
// echo "GIT_PREVIOUS_COMMIT ${env.GIT_PREVIOUS_COMMIT}"
// echo "GIT_PREVIOUS_SUCCESSFUL_COMMIT ${env.GIT_PREVIOUS_SUCCESSFUL_COMMIT}"
echo "_AssemblyName ${_AssemblyName}" // ...
echo "_ExePath ${_ExePath}" // ...
echo "_PortNumber ${_PortNumber}" // ...
echo "BUILD_NUMBER ${env.BUILD_NUMBER}" // 11
echo "DEFAULT_FILE_SERVER ${params.DEFAULT_FILE_SERVER}" // 11
echo "GIT_BRANCH ${env.GIT_BRANCH}" // origin/master
echo "GIT_COMMIT ${env.GIT_COMMIT}" // 73b814069f2cf0173a62a8228815a9bc9ba93c41
echo "GIT_SERVER ${params.GIT_SERVER}" // ...
echo "GIT_URL ${env.GIT_URL}" // D:\ProgramData\Git\....git
echo "JENKINS_ENVIRONMENT ${env.JENKINS_ENVIRONMENT}" // 11
echo "JENKINS_URL ${env.JENKINS_URL}" // http://localhost:8080/
echo "JOB_NAME ${env.JOB_NAME}" // ...
echo "PROJECT_DIRECTORY ${env.PROJECT_DIRECTORY}" // ...
echo "WORKSPACE ${env.WORKSPACE}" // D:\.jenkins\_\...
}
}
// stage('Restore') {
// steps {
// bat(returnStatus: true, script: 'dotnet --info')
// }
// }
stage('Safe storage of app secrets') {
steps {
withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) {
dir(env.PROJECT_DIRECTORY) {
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets init')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "Company" "' + _Company + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "ServiceUser" "' + username + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "BuildNumber" "' + env.BUILD_NUMBER + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "GitCommitSeven" "' + _GitCommitSeven + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "Server" "' + params.DEFAULT_FILE_SERVER + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "URLs" "' + 'http://localhost:' + _PortNumber)
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "WorkingDirectoryName" "' + _WorkingDirectoryName + '"')
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'user-secrets set "MonARessource" "' + _MonARessource + '_' + env.PROJECT_DIRECTORY + env.MONA_SUFFIX + '"')
}
}
}
}
// stage('Core Build (packagemanagement.eu.infineon.com)') {
// steps {
// echo "Build number is ${currentBuild.number}"
// dir(env.PROJECT_DIRECTORY) {
// bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
// 'build --runtime win-x64 --self-contained --verbosity quiet --source ' +
// 'https://packagemanagement.eu.infineon.com:4430/api/v2/')
// }
// }
// }
stage('Core Build') {
steps {
echo "Build number is ${currentBuild.number}"
dir(env.PROJECT_DIRECTORY) {
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'build --runtime win-x64 --self-contained --verbosity quiet')
}
}
}
stage('Commit Id') {
steps {
dir(env.PROJECT_DIRECTORY) {
writeFile(file: 'bin/Debug/' + _NetVersion + "/win-x64/${env.GIT_COMMIT}-${env.BUILD_NUMBER}.txt", text: "${env.GIT_URL}")
}
}
}
// stage('Test') {
// options {
// timeout(time: 10, unit: 'MINUTES')
// }
// steps {
// dir(env.PROJECT_DIRECTORY) {
// bat('dotnet --info')
// }
// }
// }
// stage('Version') {
// steps {
// bat('dotnet --info')
// }
// }
stage('Package') {
steps {
dir(env.PROJECT_DIRECTORY) {
fileOperations([fileZipOperation(folderPath: 'bin/Debug/' + _NetVersion + '/win-x64', outputFolderPath: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-Debug")])
fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*", renameFiles: false, sourceCaptureExpression: '', targetLocation: "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-Debug", targetNameExpression: '')])
}
}
}
stage('Publish') {
steps {
dir(env.PROJECT_DIRECTORY) {
bat(returnStatus: true, script: '"' + _ProgramFilesDotnet + '" ' +
'publish --configuration Release --runtime win-x64 --verbosity quiet ' +
"--self-contained true --p:Version=6.0.202-${_GitCommitSeven}-${env.BUILD_NUMBER} -o " +
'"' + "${_DDriveNet}/${_GitCommitSeven}-${env.BUILD_NUMBER}-${_PortNumber}-${env.JOB_NAME}-${env.PROJECT_DIRECTORY}" + '"')
}
}
}
stage('Service') {
steps {
withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) {
bat(returnStatus: true, script: 'sc create "' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '" ' +
'start= delayed-auto DisplayName="' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '" ' +
'binPath= "' + _ExePath + '" ' +
'obj= "' + "${env.USERDOMAIN}\\${username}" + '" password= "' + password + '"')
bat(returnStatus: true, script: 'sc start "' + "${env.JOB_NAME}-${env.PROJECT_DIRECTORY}-${_PortNumber}" + '"')
}
}
}
stage('Upadate NGINX') {
steps {
writeFile(file: _NGINXFile, text: "location / { proxy_pass http://localhost:${_PortNumber}; }")
}
}
stage('NGINX Test and Reload') {
steps {
withCredentials([usernamePassword(credentialsId: _CredentialsId, passwordVariable: 'password', usernameVariable: 'username')]) {
dir("C:/Users/${username}/AppData/Local/IFXApps/nginx-1.20.1") {
script {
int returnStatus = bat(returnStatus: true, script: 'nginx.exe -t')
println("returnStatus ################ ${returnStatus} ####################")
if (returnStatus == 0) {
bat(returnStatus: true, script: 'nginx.exe -s reload')
}
}
}
}
}
}
// stage('Force Fail') {
// steps {
// error("Build failed because of this and that..")
// }
// }
// stage('Copy Files to: file-share') {
// steps {
// dir(env.PROJECT_DIRECTORY + '/bin/Debug/' + _NetVersion + '/win-x64') {
// fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.txt", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')])
// fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.dll", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')])
// fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.exe", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')])
// fileOperations([fileCopyOperation(excludes: '', flattenFiles: true, includes: "${_AssemblyName}*.pdb", renameFiles: false, sourceCaptureExpression: '', targetLocation: _TargetLocation, targetNameExpression: '')])
// }
// }
// }
}
post {
always {
dir(env.PROJECT_DIRECTORY + '/bin') {
deleteDir()
}
dir(env.PROJECT_DIRECTORY + '/obj') {
deleteDir()
}
cleanWs()
}
}
}

View File

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

1
Server/.vscode/format-report.json vendored Normal file
View File

@ -0,0 +1 @@
[]

View File

@ -10,14 +10,15 @@
"request": "launch",
"preLaunchTask": "build",
// If you have changed target frameworks, make sure to update the program path.
"program": "${workspaceFolder}/bin/Debug/net6.0/win-x64/Archive.dll",
"program": "${workspaceFolder}/bin/Debug/net8.0/OI.Metrology.Server.dll",
"args": [],
"cwd": "${workspaceFolder}",
"stopAtEntry": false,
// Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
"serverReadyAction": {
"action": "openExternally",
"pattern": "\\bNow listening on:\\s+(https?://\\S+)"
"pattern": "\\bNow listening on:\\s+(https?://\\S+)",
"uriFormat": "%s/swagger/index.html"
},
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
@ -30,7 +31,8 @@
"name": ".NET Core Attach",
"type": "coreclr",
"request": "attach",
"processName": "Archive"
"preLaunchTask": "watch",
"processName": "OI.Metrology.Server.exe"
}
]
}

5
Server/.vscode/settings.json vendored Normal file
View File

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

174
Server/.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,174 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/OI.Metrology.Server.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "buildTests",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/../Tests/OI.Metrology.Tests.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "testDebug",
"command": "dotnet",
"type": "process",
"args": [
"test",
"${workspaceFolder}/../Tests/OI.Metrology.Tests.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
},
{
"label": "testRelease",
"command": "dotnet",
"type": "process",
"args": [
"test",
"${workspaceFolder}/../Tests/OI.Metrology.Tests.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary",
"-c",
"Release"
],
"problemMatcher": "$msCompile"
},
{
"label": "Format",
"command": "dotnet",
"type": "process",
"args": [
"format",
"--report",
".vscode",
"--verbosity",
"detailed",
"--severity",
"warn"
],
"problemMatcher": "$msCompile"
},
{
"label": "Format-Whitespace",
"command": "dotnet",
"type": "process",
"args": [
"format",
"whitespace"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/OI.Metrology.Server.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary",
"--configuration",
"Release",
"--runtime",
"win-x64",
"--self-contained",
"-o",
"D:/web-sites/OI-Metrology/hh-3498d1da-_______-OI-Metrology-Release/Server"
],
"problemMatcher": "$msCompile"
},
{
"label": "Publish AOT",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/OI.Metrology.Server.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary",
"--configuration",
"Release",
"--runtime",
"win-x64",
"-p:PublishAot=true",
"/property:GenerateFullPaths=true"
],
"problemMatcher": "$msCompile"
},
{
"label": "old-watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/OI.Metrology.Server.csproj"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"--launch-profile",
"http",
"run",
"--project",
"${workspaceFolder}/OI.Metrology.Server.csproj",
"--verbose"
],
"isBackground": true,
"dependsOn": [
"build"
],
"problemMatcher": {
"fileLocation": "relative",
"pattern": {
"regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$",
"file": 1,
"location": 2,
"severity": 3,
"code": 4,
"message": 5
},
"background": {
"activeOnStart": true,
"beginsPattern": "^.*Shutdown requested.*",
"endsPattern": "^.*Application started.*"
}
}
},
{
"label": "File-Folder-Helper AOT s X Server",
"type": "shell",
"command": "L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net8.0/win-x64/publish/File-Folder-Helper.exe",
"args": [
"s",
"X",
"L:/DevOps/Mesa_FI/OI-Metrology Day-Helper-2024-01-08 L:/DevOps/Mesa_FI/OI-Metrology/Server"
],
"problemMatcher": []
}
]
}

View File

@ -0,0 +1,23 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.Models.Stateless;
namespace OI.Metrology.Server.ApiControllers;
[ApiController]
[Route("api/[controller]")]
public class AppSettingsController : ControllerBase, IAppSettingsController<ActionResult>
{
private readonly IAppSettingsRepository<Models.Binder.AppSettings> _AppSettingsRepository;
public AppSettingsController(IAppSettingsRepository<Models.Binder.AppSettings> AppSettingsRepository) => _AppSettingsRepository = AppSettingsRepository;
[HttpGet(nameof(IAppSettingsController<ActionResult>.Action.App))]
public ActionResult GetAppSettings() =>
Ok(_AppSettingsRepository.GetAppSettings());
[HttpGet(nameof(IAppSettingsController<ActionResult>.Action.DevOps))]
public ActionResult GetBuildNumberAndGitCommitSeven() =>
Ok(_AppSettingsRepository.GetBuildNumberAndGitCommitSeven());
}

View File

@ -1,50 +1,39 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
using System;
using System.IO;
namespace OI.Metrology.Viewer.ApiControllers;
namespace OI.Metrology.Server.ApiControllers;
public class AttachmentsController : Controller
{
private readonly IMetrologyRepo _Repo;
private readonly IAttachmentsService _AttachmentsService;
public AttachmentsController(IMetrologyRepo repo, IAttachmentsService attachmentsService)
private readonly IAttachmentsService _AttachmentsService;
private readonly IMetrologyRepository _MetrologyRepository;
public AttachmentsController(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService)
{
_Repo = repo;
_AttachmentsService = attachmentsService;
_MetrologyRepository = metrologyRepository;
}
// this endpoint was created in hope that it would make retrieving attachments to display in OpenInsight easier
// url would be like /api/attachments/mercuryprobe/header/HgProbe_66-232268-4329_20180620052640032/data.pdf
[HttpGet("/api/attachments/{toolTypeName}/{tabletype}/{title}/{filename}")]
public IActionResult GetAttachment(
string toolTypeName,
string tabletype,
string title,
string filename)
public IActionResult GetAttachment(string toolTypeName, string tabletype, string title, string filename)
{
ToolType tt = _Repo.GetToolTypeByName(toolTypeName);
ToolType tt = _MetrologyRepository.GetToolTypeByName(toolTypeName);
bool header = !string.Equals(tabletype.Trim(), "data", StringComparison.OrdinalIgnoreCase);
try
{
string contenttype = "application/pdf";
if (filename.ToLower().TrimEnd().EndsWith(".txt"))
contenttype = "text/plain";
Stream fs = _AttachmentsService.GetAttachmentStreamByTitle(tt, header, title, filename);
return File(fs, contenttype);
}
catch (Exception ex)
{
return Content(ex.Message);
}
catch (Exception ex) { return Content(ex.Message); }
}
}

View File

@ -0,0 +1,47 @@
using Microsoft.AspNetCore.Mvc;
namespace OI.Metrology.Server.ApiControllers;
using OI.Metrology.Shared.Models.Stateless;
using System.Text.Json;
// this controller is for the Awaiting Dispo functionality
[Route("api/[controller]")]
public class AwaitingDispoController : Controller, IAwaitingDispoController<IActionResult>
{
private readonly IMetrologyRepository _MetrologyRepository;
public AwaitingDispoController(IMetrologyRepository metrologyRepository) =>
_MetrologyRepository = metrologyRepository;
// returns the data to show in the Awaiting Dispo grid
// marked no-cache, just-in-case since igniteUI automatically adds a query string parameter to prevent caching
[HttpGet]
[ResponseCache(NoStore = true)]
public IActionResult Index() =>
Json(_MetrologyRepository.GetAwaitingDisposition(), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
// this endpoint is used to set the ReviewDate column, causing the header to no longer show in Awaiting Dispo
[HttpPost("/api/awaitingdispo/markasreviewed")]
public IActionResult MarkAsReviewed([FromQuery] long headerid, [FromQuery] int tooltypeid)
{
_ = _MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, false);
return Ok();
}
// this endpoint is used to clear the ReviewDate column, causing the header to show up again
[HttpPost("/api/awaitingdispo/markasawaiting")]
public IActionResult MarkAsAwaiting([FromQuery] long headerid, [FromQuery] int tooltypeid)
{
if (_MetrologyRepository.UpdateReviewDate(tooltypeid, headerid, true) <= 1)
return Ok();
else
return StatusCode(444);
}
// this endpoint is used to clear the ReviewDate column, causing the header to show up again
[HttpGet("/api/awaitingdispo/{toolTypeId}/header-attachment-id")]
public IActionResult GetHeaderAttachmentID(int toolTypeId, [FromQuery] long headerid) =>
Content(_MetrologyRepository.GetHeaderAttachmentID(toolTypeId, headerid).ToString());
}

View File

@ -0,0 +1,29 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.Models.Stateless;
namespace OI.Metrology.Server.ApiControllers;
[ApiController]
[Route("api/[controller]")]
public class ClientSettingsController : ControllerBase, IClientSettingsController<ActionResult>
{
private readonly IClientSettingsRepository _ClientSettingsRepository;
public ClientSettingsController(IClientSettingsRepository clientSettingsRepository) => _ClientSettingsRepository = clientSettingsRepository;
[HttpGet(nameof(IClientSettingsController<ActionResult>.Action.Client))]
public ActionResult GetClientSettings()
{
List<string> results = _ClientSettingsRepository.GetClientSettings(Request.HttpContext.Connection?.RemoteIpAddress);
return Ok(results);
}
[HttpGet(nameof(IClientSettingsController<ActionResult>.Action.IP))]
public ActionResult GetIpAddress()
{
string result = _ClientSettingsRepository.GetIpAddress(Request.HttpContext.Connection?.RemoteIpAddress);
return Ok(result);
}
}

View File

@ -0,0 +1,104 @@
using Microsoft.AspNetCore.Mvc;
namespace OI.Metrology.Server.ApiControllers;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless;
using System.Data;
using System.Text.Json;
[Route("api/[controller]")]
public class ExportController : Controller, IExportController<IActionResult>
{
private readonly IExportRepository _ExportRepository;
private readonly IMetrologyRepository _MetrologyRepository;
public ExportController(IExportRepository exportRepository, IMetrologyRepository metrologyRepository)
{
_ExportRepository = exportRepository;
_MetrologyRepository = metrologyRepository;
}
private static string? GetJson(Stream stream)
{
string? result;
if (!stream.CanRead)
result = null;
else
{
Task<string> task = new StreamReader(stream).ReadToEndAsync();
result = task.Result;
}
return result;
}
private static HeaderCommon GetHeaderCommon(Stream stream)
{
HeaderCommon? result;
string? json = GetJson(stream);
result = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize<HeaderCommon>(json);
result ??= new();
return result;
}
[HttpGet]
[Route("export")]
public IActionResult GetExport() =>
Content(_ExportRepository.GetExport(GetHeaderCommon(Request.Body)));
[HttpGet]
[Route("headers")]
public IActionResult GetHeaders() =>
Json(_ExportRepository.GetHeaders(GetHeaderCommon(Request.Body)), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
[HttpGet]
[Route("logistics")]
public IActionResult GetLogistics() =>
Json(_ExportRepository.GetLogistics(GetHeaderCommon(Request.Body)), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
[HttpGet]
[Route("pdsf")]
[Route("processDataStandardFormat")]
public IActionResult GetProcessDataStandardFormat() =>
Content(_ExportRepository.GetProcessDataStandardFormat(GetHeaderCommon(Request.Body)));
[HttpPost]
[Route("export")]
public IActionResult PostExport() =>
Content(_ExportRepository.GetExport(GetHeaderCommon(Request.Body)));
[HttpPost]
[Route("headers")]
public IActionResult PostHeaders() =>
Json(_ExportRepository.GetHeaders(GetHeaderCommon(Request.Body)), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
[HttpPost]
[Route("logistics")]
public IActionResult PostLogistics() =>
Json(_ExportRepository.GetLogistics(GetHeaderCommon(Request.Body)), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
[HttpPost]
[Route("pdsf")]
[Route("processDataStandardFormat")]
public IActionResult PostProcessDataStandardFormat() =>
Content(_ExportRepository.GetProcessDataStandardFormat(GetHeaderCommon(Request.Body)));
[HttpGet]
[Route("{toolTypeId}/export")]
public IActionResult GetExportData(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend)
{
Result<DataTable> r = _ExportRepository.GetExportData(_MetrologyRepository, toolTypeId, datebegin, dateend);
string json = Newtonsoft.Json.JsonConvert.SerializeObject(r);
return Content(json);
}
[HttpGet]
[Route("{toolTypeId}/csv")]
public IActionResult GetCSVExport(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] string? filename)
{
string r = _ExportRepository.GetCSVExport(_MetrologyRepository, toolTypeId, datebegin, dateend);
return Content(r);
}
}

View File

@ -0,0 +1,36 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.Models.Stateless;
namespace OI.Metrology.Server.ApiControllers;
[Route("api/v1/file-share")]
public class FileShareController : Controller, IFileShareController<IResult>
{
private readonly IFileShareRepository _FileShareRepository;
public FileShareController(IFileShareRepository fileShareRepository) =>
_FileShareRepository = fileShareRepository;
[HttpGet("copy-file")]
public IResult CopyFile(string from, string to)
{
_FileShareRepository.CopyFile(from, to);
return Results.Ok();
}
[HttpGet("move-file")]
public IResult MoveFile(string from, string to)
{
_FileShareRepository.MoveFile(from, to);
return Results.Ok();
}
[HttpGet("file-write")]
public IResult FileWrite(string path, string contents)
{
_FileShareRepository.FileWrite(path, contents);
return Results.Ok();
}
}

View File

@ -0,0 +1,70 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
using System.Net;
using System.Text.Json;
namespace OI.Metrology.Server.ApiControllers;
[ApiController]
[Route("api/[controller]")]
public partial class InboundController : ControllerBase, IInboundController<IActionResult>
{
private readonly ILogger _Logger;
private readonly AppSettings _AppSettings;
private readonly IInboundRepository _InboundRepository;
private readonly IAttachmentsService _AttachmentsService;
private readonly IInboundDataService _InboundDataService;
private readonly IMetrologyRepository _MetrologyRepository;
public InboundController(AppSettings appSettings, ILogger<InboundController> logger, IMetrologyRepository metrologyRepository, IInboundRepository inboundRepository, IInboundDataService inboundDataService, IAttachmentsService attachmentsService)
{
_Logger = logger;
_AppSettings = appSettings;
_InboundRepository = inboundRepository;
_AttachmentsService = attachmentsService;
_InboundDataService = inboundDataService;
_MetrologyRepository = metrologyRepository;
}
[HttpPost]
[Route("{tooltype}")]
public IActionResult Post(string tooltype, JsonElement? jsonElement)
{
IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress;
if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP))
{
_Logger.LogInformation($"Rejected remote IP: {remoteIP}");
return Unauthorized("Remote IP is not on allowed list");
}
else
{
DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, jsonElement);
if (dataResponse.Errors.Count == 0)
return Ok(dataResponse);
else
return BadRequest(dataResponse);
}
}
[HttpPost]
[Route("{tooltype}/attachment")]
public IActionResult AttachFile(string tooltype, Attachment? attachment)
{
IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress;
if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP))
{
_Logger.LogInformation($"Rejected remote IP: {remoteIP}");
return Unauthorized("Remote IP is not on allowed list");
}
else
{
_InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, attachment);
return Ok();
}
}
}

View File

@ -0,0 +1,52 @@
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/[controller]")]
public class InfinityQSController : Controller, IInfinityQSController<IActionResult>
{
private readonly IInfinityQSRepository _InfinityQSRepository;
public InfinityQSController(IInfinityQSRepository InfinityQSRepository) => _InfinityQSRepository = InfinityQSRepository;
[HttpGet("commandText")]
public IActionResult GetCommandText(string sub_group_id, string process, string job, string part, string lot, string date_time)
{
string commandText = _InfinityQSRepository.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<InfinityQSBase[]> result = _InfinityQSRepository.GetData(sub_group_id);
return Json(result, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
[HttpGet("{sub_group_id}/descriptors")]
public IActionResult GetDescriptors(string sub_group_id)
{
Result<InfinityQSDescriptor[]> result = _InfinityQSRepository.GetDescriptors(sub_group_id);
return Json(result, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
[HttpGet("{sub_group_id}/events")]
public IActionResult GetEvents(string sub_group_id)
{
Result<InfinityQSEvent[]> result = _InfinityQSRepository.GetEvents(sub_group_id);
return Json(result, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
[HttpGet("{sub_group_id}/header")]
public IActionResult GetHeader(string sub_group_id)
{
Result<InfinityQSBase[]> result = _InfinityQSRepository.GetHeader(sub_group_id);
return Json(result, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
}

View File

@ -0,0 +1,52 @@
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/[controller]")]
public class InfinityQSV2Controller : Controller, IInfinityQSV2Controller<IActionResult>
{
private readonly IInfinityQSV2Repository _InfinityQSRepositoryV2;
public InfinityQSV2Controller(IInfinityQSV2Repository InfinityQSRepositoryV2) => _InfinityQSRepositoryV2 = InfinityQSRepositoryV2;
[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 = _InfinityQSRepositoryV2.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<InfinityQSBaseV2[]> result = _InfinityQSRepositoryV2.GetData(sub_group_id);
return Json(result, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
[HttpGet("{sub_group_id}/descriptors")]
public IActionResult GetDescriptors(string sub_group_id)
{
Result<InfinityQSDescriptorV2[]> result = _InfinityQSRepositoryV2.GetDescriptors(sub_group_id);
return Json(result, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
[HttpGet("{sub_group_id}/events")]
public IActionResult GetEvents(string sub_group_id)
{
Result<InfinityQSEventV2[]> result = _InfinityQSRepositoryV2.GetEvents(sub_group_id);
return Json(result, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
[HttpGet("{sub_group_id}/header")]
public IActionResult GetHeader(string sub_group_id)
{
Result<InfinityQSBaseV2[]> result = _InfinityQSRepositoryV2.GetHeader(sub_group_id);
return Json(result, new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}
}

View File

@ -0,0 +1,70 @@
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/[controller]")]
public class InfinityQSV3Controller : Controller, IInfinityQSV3Controller<IActionResult>
{
private readonly IInfinityQSV3Repository _InfinityQSRepositoryV3;
public InfinityQSV3Controller(IInfinityQSV3Repository InfinityQSRepositoryV3) => _InfinityQSRepositoryV3 = InfinityQSRepositoryV3;
[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 = _InfinityQSRepositoryV3.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<InfinityQSV3[]> result = _InfinityQSRepositoryV3.GetData(sub_group_id);
string json = JsonSerializer.Serialize(result, ResultInfinityQSV3SourceGenerationContext.Default.ResultInfinityQSV3Array);
return Content(json, "application/json", System.Text.Encoding.UTF8);
}
[HttpGet("{sub_group_id}/descriptors")]
public IActionResult GetDescriptors(string sub_group_id)
{
Result<InfinityQSDescriptorV3[]> result = _InfinityQSRepositoryV3.GetDescriptors(sub_group_id);
string json = JsonSerializer.Serialize(result, ResultInfinityQSDescriptorV3SourceGenerationContext.Default.ResultInfinityQSDescriptorV3Array);
return Content(json, "application/json", System.Text.Encoding.UTF8);
}
[HttpGet("{sub_group_id}/header")]
public IActionResult GetHeader(string sub_group_id)
{
Result<InfinityQSV3[]> result = _InfinityQSRepositoryV3.GetHeader(sub_group_id);
string json = JsonSerializer.Serialize(result, ResultInfinityQSV3SourceGenerationContext.Default.ResultInfinityQSV3Array);
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 = _InfinityQSRepositoryV3.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(process, recipe);
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,86 @@
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("{process}/last-group-id-with-value")]
public IActionResult GetLastGroupIdWithValue(string process, string? part, int? test) =>
Content(_InfinityQSRepositoryV4.GetLastGroupIdWithValue(process, part, test));
}

View File

@ -0,0 +1,24 @@
using Microsoft.AspNetCore.Mvc;
namespace OI.Metrology.Server.ApiControllers;
using OI.Metrology.Shared.Models.Stateless;
[Route("api/[controller]")]
public class OpenInsightV1Controller : Controller, IOpenInsightV1Controller<IActionResult>
{
private readonly IOpenInsightV1Repository _OpenInsightRepository;
public OpenInsightV1Controller(IOpenInsightV1Repository openInsightRepository) =>
_OpenInsightRepository = openInsightRepository;
[HttpGet]
[Route("{rds}/tencor-run")]
public IActionResult GetTencorRun(string rds, string? insert_date, string? recipe)
{
string result = _OpenInsightRepository.GetTencorRun(rds, insert_date, recipe);
return Content(result, "application/json", System.Text.Encoding.UTF8);
}
}

View File

@ -0,0 +1,33 @@
using Microsoft.AspNetCore.Mvc;
namespace OI.Metrology.Server.ApiControllers;
using OI.Metrology.Shared.Models.Stateless;
using System.Text.Json;
[Route("api/[controller]")]
public class PinController : Controller, IPinController<IActionResult>
{
private readonly IPinRepository _PinRepository;
private readonly IMetrologyRepository _MetrologyRepository;
public PinController(IMetrologyRepository metrologyRepository, IPinRepository pinRepository)
{
_MetrologyRepository = metrologyRepository;
_PinRepository = pinRepository;
}
[HttpPost("{toolTypeId}/markAsPinned")]
public IActionResult MarkAsPinned(Shared.DataModels.HeaderCommon headerCommon)
{
_PinRepository.SetPinnedTable(headerCommon);
return Ok();
}
[HttpGet]
[Route("{toolTypeId}/pinned")]
public IActionResult GetPinnedTable(int toolTypeId, string? biorad_id = null, string? cde_id = null, string? rds = null) =>
Json(_PinRepository.GetPinnedTable(_MetrologyRepository, toolTypeId, biorad_id, cde_id, rds), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
}

View File

@ -0,0 +1,46 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.Models.Stateless;
namespace OI.Metrology.Server.ApiControllers;
[ApiController]
[Route("api/[controller]")]
public class ServiceShopOrderController : ControllerBase, IServiceShopOrderController<ActionResult>
{
private readonly IServiceShopOrderRepository _ServiceShopOrderRepository;
public ServiceShopOrderController(IServiceShopOrderRepository ServiceShopOrderRepository) => _ServiceShopOrderRepository = ServiceShopOrderRepository;
[HttpGet(nameof(IServiceShopOrderController<ActionResult>.Action.All))]
public async Task<ActionResult> GetAllServiceShopOrders()
{
try
{
Shared.ViewModels.ServiceShopOrder[] results = await _ServiceShopOrderRepository.GetAllServiceShopOrders();
return Ok(results);
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError,
"Error retrieving data from the database");
}
}
[HttpGet]
[Route("{id}")]
public async Task<ActionResult> GetServiceShopOrders(string id)
{
try
{
Shared.ViewModels.ServiceShopOrder[] results = await _ServiceShopOrderRepository.GetServiceShopOrders(id);
return Ok(results);
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError,
"Error retrieving data from the database");
}
}
}

View File

@ -0,0 +1,38 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
namespace OI.Metrology.Server.ApiControllers;
[ApiController]
[Route("api/[controller]")]
public partial class SpreadingResistanceProfileController : ControllerBase, ISpreadingResistanceProfileController<IActionResult>
{
private readonly IAttachmentsService _AttachmentsService;
private readonly IMetrologyRepository _MetrologyRepository;
private readonly IToolTypesRepository _ToolTypesRepository;
private readonly ISpreadingResistanceProfileService _SpreadingResistanceProfileService;
public SpreadingResistanceProfileController(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, IToolTypesRepository toolTypesRepository, ISpreadingResistanceProfileService spreadingResistanceProfileService)
{
_MetrologyRepository = metrologyRepository;
_AttachmentsService = attachmentsService;
_ToolTypesRepository = toolTypesRepository;
_SpreadingResistanceProfileService = spreadingResistanceProfileService;
}
[HttpGet]
[Route("{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")]
public IActionResult GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename)
{
(string? message, string? contenttype, Stream? stream) = _ToolTypesRepository.GetAttachment(_MetrologyRepository, _AttachmentsService, toolTypeId, tabletype, attachmentId, filename);
if (message is not null)
return Content(message);
else if (contenttype is not null && stream is not null)
return File(_SpreadingResistanceProfileService.GetImageBytes(stream), "image/jpeg");
else
throw new Exception();
}
}

View File

@ -0,0 +1,93 @@
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
namespace OI.Metrology.Server.ApiControllers;
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
using System.Data;
using System.Text.Json;
[Route("api/[controller]")]
public class ToolTypesController : Controller, IToolTypesController<IActionResult>
{
// this controller powers the bulk of the UI
// it is named after the /api/tooltypes prefix
// the URL pattern is RESTful and the tool type is the root of every request
private readonly AppSettings _AppSettings;
private readonly IMetrologyRepository _MetrologyRepo;
private readonly IAttachmentsService _AttachmentsService;
private readonly IToolTypesRepository _ToolTypesRepository;
public ToolTypesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, IToolTypesRepository toolTypesRepository)
{
_AppSettings = appSettings;
_MetrologyRepo = metrologyRepository;
_AttachmentsService = attachmentsService;
_ToolTypesRepository = toolTypesRepository;
}
[HttpGet]
public IActionResult Index() =>
Json(_ToolTypesRepository.Index(_MetrologyRepo), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
[HttpGet]
[Route("{id}")]
public IActionResult GetToolTypeMetadata(int id, string sortby = "") =>
Json(_ToolTypesRepository.GetToolTypeMetadata(_MetrologyRepo, id, sortby), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
[HttpGet]
[Route("{id}/headers")]
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);
string json = JsonConvert.SerializeObject(r);
return Content(json);
}
[HttpGet]
[Route("{id}/headertitles")]
public IActionResult GetHeaderTitles(int id, [FromQuery] int? page, [FromQuery] int? pagesize) =>
Json(_ToolTypesRepository.GetHeaderTitles(_MetrologyRepo, id, page, pagesize), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
[HttpGet]
[Route("{id}/headers/{headerid}/fields")]
public IActionResult GetHeaderFields(int id, long headerid) =>
Json(_ToolTypesRepository.GetHeaderFields(_MetrologyRepo, id, headerid), new JsonSerializerOptions { PropertyNamingPolicy = null, WriteIndented = true });
[HttpGet]
[Route("{id}/headers/{headerid}/data")]
public IActionResult GetData(int id, long headerid)
{
Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetData(_MetrologyRepo, id, headerid);
string json = JsonConvert.SerializeObject(r);
return Content(json);
}
[HttpGet]
[Route("{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")]
public IActionResult GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename)
{
(string? message, string? contenttype, Stream? stream) = _ToolTypesRepository.GetAttachment(_MetrologyRepo, _AttachmentsService, toolTypeId, tabletype, attachmentId, filename);
if (message is not null)
return Content(message);
else if (contenttype is not null && stream is not null)
return File(stream, contenttype);
else
throw new Exception();
}
[HttpPost]
[Route("{toolTypeId}/headers/{headerid}/oiexport")]
public IActionResult OIExport(int toolTypeId, long headerid)
{
string? message = _ToolTypesRepository.OIExport(_MetrologyRepo, _AttachmentsService, toolTypeId, headerid);
if (message is null)
return Ok(new { Message = "OK" });
else
return BadRequest(JsonConvert.SerializeObject(new { message }));
}
}

View File

@ -1,13 +1,7 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using OI.Metrology.Viewer.Models;
using System;
using System.IO;
using System.Linq;
using OI.Metrology.Server.Models;
using System.Text;
using System.Threading.Tasks;
namespace OI.Metrology.Viewer;
namespace OI.Metrology.Server;
// You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
public class ApiLoggingMiddleware
@ -43,7 +37,8 @@ public class ApiLoggingMiddleware
else
{
// 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

@ -1,9 +1,7 @@
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace OI.Metrology.Viewer.Controllers;
namespace OI.Metrology.Server.Controllers;
[Route("/error")]
public class ErrorHandlerController : Controller
@ -12,10 +10,11 @@ public class ErrorHandlerController : Controller
public ErrorHandlerController(ILogger<ErrorHandlerController> logger) => _Logger = logger;
[ApiExplorerSettings(IgnoreApi = true)]
public IActionResult Index()
{
IExceptionHandlerFeature error = HttpContext.Features.Get<IExceptionHandlerFeature>();
if (error == null)
IExceptionHandlerFeature? error = HttpContext.Features.Get<IExceptionHandlerFeature>();
if (error is null)
{
return Redirect("~/");
}
@ -24,7 +23,7 @@ public class ErrorHandlerController : Controller
_Logger.LogError("Unhandled exception: " + error.Error.ToString());
dynamic r = new
{
Message = error.Error == null ? "Error" : error.Error.Message
Message = error.Error is null ? "Error" : error.Error.Message
};
return StatusCode(StatusCodes.Status500InternalServerError, r);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
{"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

@ -0,0 +1 @@
1000014-6bc0487

View File

@ -0,0 +1 @@
["remoteIpAddress"]

View File

View File

@ -0,0 +1,4 @@
{
"Results": [],
"TotalRows": 0
}

View File

@ -0,0 +1,90 @@
{
"Results": [
{
"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
}

View File

@ -0,0 +1 @@
asdf

View File

@ -0,0 +1,35 @@
select
se.f_sgrp se_sgrp,
se.f_sgtm se_sgtm,
se.f_tsno se_tsno,
se.f_val se_val,
rd.f_name rd_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,
(select count(ev.f_evnt)
from [spcepiworld].[dbo].[evnt_inf] ev
where ev.f_prcs = rd.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] rd
on se.f_prcs = rd.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
where se.f_flag = 0
and se.f_sgrp = 1677273357
and rd.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'
for json path

View File

@ -0,0 +1,905 @@
{
"Results": [
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 1,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 270
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 1,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 1
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 1,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 95
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 1,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1399.703
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 1,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 1,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 2,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 270
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 2,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 0.9
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 2,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 71
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 2,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1425.322
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 2,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 2,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 3,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 270
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 3,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 0.92
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 3,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 47
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 3,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1439.78
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 3,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 3,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 4,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 270
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 4,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 0.93
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 4,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 23
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 4,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1382.154
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 4,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 4,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 5,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 0
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 5,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 0.87
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 5,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 0
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 5,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1406.158
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 5,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 5,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 6,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 90
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 6,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 0.87
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 6,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 11
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 6,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1394.458
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 6,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 6,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 7,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 90
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 7,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 0.85
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 7,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 35
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 7,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1387.965
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 7,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 7,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 8,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 90
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 8,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 0.98
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 8,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 59
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 8,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1411.158
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 8,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 8,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 9,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 90
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 9,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 0.88
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 9,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 83
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 9,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1413.722
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 9,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 9,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 10,
"TD_TEST": 1650647347,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "T",
"SE_VAL": 90
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 10,
"TD_TEST": 1654782546,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Merit",
"SE_VAL": 0.98
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 10,
"TD_TEST": 1656716039,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "R",
"SE_VAL": 95
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 10,
"TD_TEST": 1656716040,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Rs",
"SE_VAL": 1401.816
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 10,
"TD_TEST": 1656716248,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Avg",
"SE_VAL": 1406.22
},
{
"EV_COUNT": 0,
"CL_COUNT": 0,
"SL_COUNT": 0,
"SE_SGRP": 1677273357,
"SE_SGTM": 1677273300,
"SE_TSNO": 10,
"TD_TEST": 1656716249,
"PR_NAME": "61",
"JD_NAME": "CDE5",
"PL_NAME": "575908",
"PD_NAME": "5012",
"TD_NAME": "Temp",
"SE_VAL": 18.2
}
],
"TotalRows": 60
}

View File

@ -0,0 +1,236 @@
{
"Results": [
{
"SD_SGRP": 1677273357,
"SD_TSNO": 0,
"DD_DSGP": 1655312695,
"GD_NAME": "Recipe",
"DD_NAME": "LSL8IN \\ 10PT_5mm"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 0,
"DD_DSGP": 1656696777,
"GD_NAME": "Layer",
"DD_NAME": "1"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 0,
"DD_DSGP": 1656696778,
"GD_NAME": "Zone",
"DD_NAME": "1"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 1,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 2,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 3,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 4,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 5,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 6,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 7,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 8,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 9,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 10,
"DD_DSGP": 1656716039,
"GD_NAME": "DataReject",
"DD_NAME": "3.00"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 1,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "1"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 2,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "2"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 3,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "3"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 4,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "4"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 5,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "5"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 6,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "6"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 7,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "7"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 8,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "8"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 9,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "9"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 10,
"DD_DSGP": 1656716040,
"GD_NAME": "Pt",
"DD_NAME": "10"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 1,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 2,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 3,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 4,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 5,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 6,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 7,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 8,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 9,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
},
{
"SD_SGRP": 1677273357,
"SD_TSNO": 10,
"DD_DSGP": 1656716042,
"GD_NAME": "StdDev",
"DD_NAME": "1.23%"
}
],
"TotalRows": 33
}

View File

@ -0,0 +1,4 @@
{
"Results": [],
"TotalRows": 0
}

View File

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

View File

@ -0,0 +1,50 @@
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
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,
(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)
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
where se.f_flag = 0
and se.f_sgrp = 1677273357
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.ev_count desc, iq.cl_count desc, iq.sl_count desc, iq.se_sgrp, iq.se_tsno, iq.td_test
for json path

View File

@ -0,0 +1,905 @@
{
"Results": [
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 1,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 270
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 1,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 1
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 1,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 95
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 1,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1399.703
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 1,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 1,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 2,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 270
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 2,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 0.9
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 2,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 71
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 2,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1425.322
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 2,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 2,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 3,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 270
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 3,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 0.92
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 3,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 47
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 3,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1439.78
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 3,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 3,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 4,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 270
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 4,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 0.93
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 4,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 23
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 4,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1382.154
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 4,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 4,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 5,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 0
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 5,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 0.87
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 5,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 0
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 5,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1406.158
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 5,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 5,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 6,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 90
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 6,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 0.87
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 6,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 11
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 6,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1394.458
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 6,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 6,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 7,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 90
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 7,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 0.85
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 7,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 35
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 7,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1387.965
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 7,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 7,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 8,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 90
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 8,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 0.98
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 8,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 59
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 8,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1411.158
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 8,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 8,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 9,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 90
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 9,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 0.88
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 9,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 83
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 9,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1413.722
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 9,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 9,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 10,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 90
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 10,
"VariableNumber": 1654782546,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Merit",
"Value": 0.98
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 10,
"VariableNumber": 1656716039,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "R",
"Value": 95
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 10,
"VariableNumber": 1656716040,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Rs",
"Value": 1401.816
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 10,
"VariableNumber": 1656716248,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Avg",
"Value": 1406.22
},
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 10,
"VariableNumber": 1656716249,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "Temp",
"Value": 18.2
}
],
"TotalRows": 60
}

View File

@ -0,0 +1,236 @@
{
"Results": [
{
"SubGroupId": 1677273357,
"SiteNumber": 0,
"VariableNumber": 1655312695,
"Variable": "Recipe",
"Value": "LSL8IN \\ 10PT_5mm"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 0,
"VariableNumber": 1656696777,
"Variable": "Layer",
"Value": "1"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 0,
"VariableNumber": 1656696778,
"Variable": "Zone",
"Value": "1"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 1,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 2,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 3,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 4,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 5,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 6,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 7,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 8,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 9,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 10,
"VariableNumber": 1656716039,
"Variable": "DataReject",
"Value": "3.00"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 1,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "1"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 2,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "2"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 3,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "3"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 4,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "4"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 5,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "5"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 6,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "6"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 7,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "7"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 8,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "8"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 9,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "9"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 10,
"VariableNumber": 1656716040,
"Variable": "Pt",
"Value": "10"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 1,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 2,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 3,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 4,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 5,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 6,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 7,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 8,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 9,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
},
{
"SubGroupId": 1677273357,
"SiteNumber": 10,
"VariableNumber": 1656716042,
"Variable": "StdDev",
"Value": "1.23%"
}
],
"TotalRows": 33
}

View File

@ -0,0 +1,4 @@
{
"Results": [],
"TotalRows": 0
}

View File

@ -0,0 +1,20 @@
{
"Results": [
{
"EventCount": 0,
"ControlLimitCount": 0,
"SpecLimitCount": 0,
"SubGroupId": 1677273357,
"SubGroupDateTime": 1677273300,
"SiteNumber": 1,
"VariableNumber": 1650647347,
"Process": "61",
"Job": "CDE5",
"Lot": "575908",
"Part": "5012",
"Variable": "T",
"Value": 270
}
],
"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

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,152 @@
{
"Results": [
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657291789,
"gd_name": "CondType",
"dd_name": "N"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657291789,
"gd_name": "CondType",
"dd_name": "N"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657291790,
"gd_name": "GLimit",
"dd_name": "2000.00 \u00B5"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657291790,
"gd_name": "GLimit",
"dd_name": "2000.00 \u00B5"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657296863,
"gd_name": "Model",
"dd_name": "PARALLEL"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657296863,
"gd_name": "Model",
"dd_name": "PARALLEL"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 0,
"dd_dsgp": 1657296864,
"gd_name": "Pattern",
"dd_name": "ONEPT.PAT"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657296865,
"gd_name": "Phase",
"dd_name": "90.000"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657296865,
"gd_name": "Phase",
"dd_name": "90.000"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657296866,
"gd_name": "Plan",
"dd_name": "5PT MES"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657296866,
"gd_name": "Plan",
"dd_name": "5PT MES"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657296867,
"gd_name": "RampRate",
"dd_name": "2500"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657296867,
"gd_name": "RampRate",
"dd_name": "2500"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657296868,
"gd_name": "RhoMethod",
"dd_name": "ASTM: F723 - 82"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657296868,
"gd_name": "RhoMethod",
"dd_name": "ASTM: F723 - 82"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657296869,
"gd_name": "StartVoltage",
"dd_name": "-5.00"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657296869,
"gd_name": "StartVoltage",
"dd_name": "-5.00"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657296870,
"gd_name": "StopVoltage",
"dd_name": "-20.00"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657296870,
"gd_name": "StopVoltage",
"dd_name": "-20.00"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 1,
"dd_dsgp": 1657296871,
"gd_name": "WaferSize",
"dd_name": "150.00"
},
{
"sd_sgrp": 1698497987,
"sd_tsno": 2,
"dd_dsgp": 1657296871,
"gd_name": "WaferSize",
"dd_name": "150.00"
}
],
"TotalRows": 21
}

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

@ -0,0 +1,25 @@
{
"Results": [
{
"iq_sum": 1,
"sl_aflag": 34,
"sl_loos": 0,
"sl_uoos": 1,
"se_sgrp": 1698497987,
"se_sgtm": 1698497973,
"se_tsno": 1,
"td_test": 1657240302,
"pr_name": "HGCV2",
"jd_name": "HGCV2",
"pl_name": "-",
"pd_name": "High",
"td_name": "RhoAvgMean",
"se_val": 12.66,
"sl_eflag": 42,
"sl_scal": 4,
"sl_sls": 12.379,
"sl_usl": 12.561
}
],
"TotalRows": 1
}

View File

@ -0,0 +1 @@
[{"ProcessMean":1.750000000000000e+001,"ProcessSigma":5.800000000000000e+000}]

View File

@ -0,0 +1 @@
[{"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

@ -0,0 +1,4 @@
{
"Results": [],
"TotalRows": 0
}

View File

@ -0,0 +1,33 @@
{
"Results": [
20,
22,
24,
26,
28,
30,
32,
34,
36,
38,
40,
42,
44,
46,
48,
50,
52,
54,
56,
58,
60,
62,
64,
66,
68,
70,
72,
74
],
"TotalRows": 28
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +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}

View File

@ -0,0 +1,93 @@
{
"Results": [
{
"Column": "ID",
"Value": ""
},
{
"Column": "InsertDate",
"Value": ""
},
{
"Column": "Title",
"Value": ""
},
{
"Column": "Recipe",
"Value": ""
},
{
"Column": "Date",
"Value": ""
},
{
"Column": "Operator",
"Value": ""
},
{
"Column": "Batch",
"Value": ""
},
{
"Column": "Cassette",
"Value": ""
},
{
"Column": "Wafer",
"Value": ""
},
{
"Column": "Mean Thickness",
"Value": ""
},
{
"Column": "RV Thickness",
"Value": ""
},
{
"Column": "Status",
"Value": ""
},
{
"Column": "Std Dev",
"Value": ""
},
{
"Column": "SentToOI",
"Value": ""
},
{
"Column": "SentToSPC",
"Value": ""
},
{
"Column": "Reactor",
"Value": ""
},
{
"Column": "RDS",
"Value": ""
},
{
"Column": "PSN",
"Value": ""
},
{
"Column": "Path",
"Value": ""
},
{
"Column": "Layer",
"Value": ""
},
{
"Column": "Zone",
"Value": ""
},
{
"Column": "Tool",
"Value": ""
}
],
"TotalRows": 22
}

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,344 @@
{
"Results": {
"ToolType": {
"ID": 1,
"ToolTypeName": "BioRad",
"HasHeaderAttachments": false,
"HasDataAttachments": false,
"HeaderTableName": "BioRadRunHeader",
"DataTableName": "BioRadRunData",
"ExportSPName": "Export_BioRad",
"HeaderGridAttributes": null,
"DataGridAttributes": "{ \u0022pinButton\u0022: true }",
"DataGridSortBy": "LEN(Position), Position",
"DataGridStatsColumn": "Thickness",
"DataGridStatsStdDevType": " ",
"DisplayHeaderAttachment": null,
"DisplayDataAttachment": null,
"OIExportSPName": "OIExport_BioRad"
},
"Metadata": [
{
"ToolTypeID": 1,
"Header": false,
"ApiName": null,
"ColumnName": "ID",
"DisplayTitle": "ID",
"GridDisplayOrder": 3,
"GridAttributes": "{ \u0022dataType\u0022: \u0022number\u0022, \u0022hidden\u0022: \u0022true\u0022 }",
"TableDisplayOrder": 1
},
{
"ToolTypeID": 1,
"Header": false,
"ApiName": null,
"ColumnName": "InsertDate",
"DisplayTitle": "InsertDate",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 2
},
{
"ToolTypeID": 1,
"Header": false,
"ApiName": "Position",
"ColumnName": "Position",
"DisplayTitle": "Position",
"GridDisplayOrder": 1,
"GridAttributes": null,
"TableDisplayOrder": 4
},
{
"ToolTypeID": 1,
"Header": false,
"ApiName": "HeaderUniqueId",
"ColumnName": "Run Header",
"DisplayTitle": "Run Header",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 6
},
{
"ToolTypeID": 1,
"Header": false,
"ApiName": "Thickness",
"ColumnName": "Thickness",
"DisplayTitle": "Thickness",
"GridDisplayOrder": 2,
"GridAttributes": null,
"TableDisplayOrder": 5
},
{
"ToolTypeID": 1,
"Header": false,
"ApiName": "UniqueId",
"ColumnName": "Title",
"DisplayTitle": "Title",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 3
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Batch",
"ColumnName": "Batch",
"DisplayTitle": "Batch",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 7
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Cassette",
"ColumnName": "Cassette",
"DisplayTitle": "Cassette",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 8
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Date",
"ColumnName": "Date",
"DisplayTitle": "Date",
"GridDisplayOrder": 1,
"GridAttributes": "{ \u0022dataType\u0022: \u0022date\u0022, \u0022format\u0022: \u0022dateTime\u0022 }",
"TableDisplayOrder": 5
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": null,
"ColumnName": "ID",
"DisplayTitle": "ID",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 1
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": null,
"ColumnName": "InsertDate",
"DisplayTitle": "InsertDate",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 2
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Layer",
"ColumnName": "Layer",
"DisplayTitle": "Layer",
"GridDisplayOrder": 6,
"GridAttributes": "{ \u0022formatter\u0022: \u0022isNull\u0022 }",
"TableDisplayOrder": 20
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "MeanThickness",
"ColumnName": "Mean Thickness",
"DisplayTitle": "Mean Thickness",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 10
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Op",
"ColumnName": "Operator",
"DisplayTitle": "Operator",
"GridDisplayOrder": 8,
"GridAttributes": "{ \u0022formatter\u0022: \u0022isNull\u0022 }",
"TableDisplayOrder": 6
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "FilePath",
"ColumnName": "Path",
"DisplayTitle": "Path",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 19
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "PSN",
"ColumnName": "PSN",
"DisplayTitle": "PSN",
"GridDisplayOrder": 5,
"GridAttributes": "{ \u0022formatter\u0022: \u0022isNull\u0022 }",
"TableDisplayOrder": 18
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "RDS",
"ColumnName": "RDS",
"DisplayTitle": "RDS",
"GridDisplayOrder": 4,
"GridAttributes": "{ \u0022formatter\u0022: \u0022isNull\u0022 }",
"TableDisplayOrder": 17
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Reactor",
"ColumnName": "Reactor",
"DisplayTitle": "Reactor",
"GridDisplayOrder": 3,
"GridAttributes": null,
"TableDisplayOrder": 16
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Recipe",
"ColumnName": "Recipe",
"DisplayTitle": "Recipe",
"GridDisplayOrder": 7,
"GridAttributes": null,
"TableDisplayOrder": 4
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "RVThickness",
"ColumnName": "RV Thickness",
"DisplayTitle": "RV Thickness",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 11
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "SentToMetrology",
"ColumnName": "SentToMetrology",
"DisplayTitle": "SentToOI",
"GridDisplayOrder": 10,
"GridAttributes": "{ \u0022dataType:\u0022: \u0022bool\u0022, \u0022formatter\u0022: \u0022boolToYesNo\u0022 }",
"TableDisplayOrder": 14
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "SentToSPC",
"ColumnName": "SentToSPC",
"DisplayTitle": "SentToSPC",
"GridDisplayOrder": 0,
"GridAttributes": "{ \u0022dataType:\u0022: \u0022bool\u0022, \u0022formatter\u0022: \u0022boolToYesNo\u0022 }",
"TableDisplayOrder": 15
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "PassFail",
"ColumnName": "Status",
"DisplayTitle": "Status",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 12
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "StdDev",
"ColumnName": "Std Dev",
"DisplayTitle": "Std Dev",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 13
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "UniqueId",
"ColumnName": "Title",
"DisplayTitle": "Title",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 3
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Wafer",
"ColumnName": "Wafer",
"DisplayTitle": "Wafer",
"GridDisplayOrder": 9,
"GridAttributes": null,
"TableDisplayOrder": 9
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Zone",
"ColumnName": "Zone",
"DisplayTitle": "Zone",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 21
},
{
"ToolTypeID": 1,
"Header": false,
"ApiName": null,
"ColumnName": "AttachmentID",
"DisplayTitle": "AttachmentID",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 0
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": null,
"ColumnName": "AttachmentID",
"DisplayTitle": "AttachmentID",
"GridDisplayOrder": 0,
"GridAttributes": null,
"TableDisplayOrder": 0
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Id",
"ColumnName": null,
"DisplayTitle": "Ignore",
"GridDisplayOrder": -1,
"GridAttributes": null,
"TableDisplayOrder": -1
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "Title",
"ColumnName": null,
"DisplayTitle": "Ignore",
"GridDisplayOrder": -1,
"GridAttributes": null,
"TableDisplayOrder": -1
},
{
"ToolTypeID": 1,
"Header": true,
"ApiName": "CellName",
"ColumnName": "Tool",
"DisplayTitle": "Tool",
"GridDisplayOrder": 2,
"GridAttributes": null,
"TableDisplayOrder": 22
}
]
},
"TotalRows": 32
}

View File

@ -0,0 +1,33 @@
{
"Results": [
{
"ToolTypeName": "BioRad",
"ID": 1
},
{
"ToolTypeName": "CDE",
"ID": 2
},
{
"ToolTypeName": "Tencor",
"ID": 3
},
{
"ToolTypeName": "MercuryProbe",
"ID": 4
},
{
"ToolTypeName": "StratusBioRad",
"ID": 5
},
{
"ToolTypeName": "TencorSP1",
"ID": 6
},
{
"ToolTypeName": "SRP",
"ID": 7
}
],
"TotalRows": 7
}

View File

@ -0,0 +1,43 @@
using System.Text.Json;
namespace OI.Metrology.Server.Models;
public record AppSettings(string ApiFileShare,
string ApiLoggingContentTypes,
string ApiLoggingPathPrefixes,
string ApiLogPath,
string ApiUrl,
string BuildNumber,
string Company,
string ConnectionString,
string EcCharacterizationSi,
string EcMesaFileShareCharacterizationSi,
string EcMesaFileShareMetrologySi,
string EcMetrologySi,
string GitCommitSeven,
string InboundApiAllowedIPList,
string IqsColumns,
string[] IqsFileSegments,
string IqsKey,
string IqsRed,
string IqsYellow,
bool IsDevelopment,
bool IsStaging,
string MockRoot,
string MonAResource,
string MonASite,
string OpenInsightApplicationProgrammingInterface,
Dictionary<string, string> TableToPath,
string URLs,
string WaferCounterDestinationDirectory,
int WaferCounterTwoFileSecondsWait,
string WorkingDirectoryName)
{
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
return result;
}
}

View File

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

View File

@ -0,0 +1,148 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace OI.Metrology.Server.Models.Binder;
public class AppSettings
{
public string? ApiFileShare { get; set; }
public string? ApiLoggingContentTypes { get; set; }
public string? ApiLoggingPathPrefixes { get; set; }
public string? ApiLogPath { get; set; }
public string? ApiUrl { get; set; }
public string? BuildNumber { get; set; }
public string? Company { get; set; }
public string? ConnectionString { get; set; }
public string? EcCharacterizationSi { get; set; }
public string? EcMesaFileShareCharacterizationSi { get; set; }
public string? EcMesaFileShareMetrologySi { get; set; }
public string? EcMetrologySi { get; set; }
public string? GitCommitSeven { get; set; }
public string? InboundApiAllowedIPList { get; set; }
public string? IqsColumns { get; set; }
public string[]? IqsFileSegments { get; set; }
public string? IqsKey { get; set; }
public string? IqsRed { get; set; }
public string? IqsYellow { get; set; }
public bool? IsDevelopment { get; set; }
public bool? IsStaging { get; set; }
public string? MockRoot { get; set; }
public string? MonAResource { get; set; }
public string? MonASite { get; set; }
public string? OpenInsightApplicationProgrammingInterface { get; set; }
public Dictionary<string, string>? TableToPath { get; set; }
public string? URLs { get; set; }
public string? WaferCounterDestinationDirectory { get; set; }
public int? WaferCounterTwoFileSecondsWait { get; set; }
public string? WorkingDirectoryName { get; set; }
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
return result;
}
private static void PreVerify(IConfigurationRoot configurationRoot, AppSettings? appSettings)
{
if (appSettings?.ApiFileShare is null)
{
List<string> paths = new();
foreach (IConfigurationProvider configurationProvider in configurationRoot.Providers)
{
if (configurationProvider is not Microsoft.Extensions.Configuration.Json.JsonConfigurationProvider jsonConfigurationProvider)
continue;
if (jsonConfigurationProvider.Source.FileProvider is not Microsoft.Extensions.FileProviders.PhysicalFileProvider physicalFileProvider)
continue;
paths.Add(physicalFileProvider.Root);
}
throw new NotSupportedException($"Not found!{Environment.NewLine}{string.Join(Environment.NewLine, paths.Distinct())}");
}
}
private static Models.AppSettings Get(AppSettings? appSettings)
{
Models.AppSettings result;
if (appSettings is null) throw new NullReferenceException(nameof(appSettings));
if (appSettings.ApiFileShare is null) throw new NullReferenceException(nameof(ApiFileShare));
if (appSettings.ApiLoggingContentTypes is null) throw new NullReferenceException(nameof(ApiLoggingContentTypes));
if (appSettings.ApiLoggingPathPrefixes is null) throw new NullReferenceException(nameof(ApiLoggingPathPrefixes));
if (appSettings.ApiLogPath is null) throw new NullReferenceException(nameof(ApiLogPath));
if (appSettings.ApiUrl is null) throw new NullReferenceException(nameof(ApiUrl));
if (appSettings.BuildNumber is null) throw new NullReferenceException(nameof(BuildNumber));
if (appSettings.Company is null) throw new NullReferenceException(nameof(Company));
if (appSettings.ConnectionString is null) throw new NullReferenceException(nameof(ConnectionString));
if (appSettings.EcCharacterizationSi is null) throw new NullReferenceException(nameof(EcCharacterizationSi));
if (appSettings.EcMesaFileShareCharacterizationSi is null) throw new NullReferenceException(nameof(EcMesaFileShareCharacterizationSi));
if (appSettings.EcMesaFileShareMetrologySi is null) throw new NullReferenceException(nameof(EcMesaFileShareMetrologySi));
if (appSettings.EcMetrologySi is null) throw new NullReferenceException(nameof(EcMetrologySi));
if (appSettings.GitCommitSeven is null) throw new NullReferenceException(nameof(GitCommitSeven));
if (appSettings.InboundApiAllowedIPList is null) throw new NullReferenceException(nameof(InboundApiAllowedIPList));
if (appSettings.IqsColumns is null) throw new NullReferenceException(nameof(IqsColumns));
if (appSettings.IqsFileSegments is null) throw new NullReferenceException(nameof(IqsFileSegments));
if (appSettings.IqsKey is null) throw new NullReferenceException(nameof(IqsKey));
if (appSettings.IqsRed is null) throw new NullReferenceException(nameof(IqsRed));
if (appSettings.IqsYellow is null) throw new NullReferenceException(nameof(IqsYellow));
if (appSettings.IsDevelopment is null) throw new NullReferenceException(nameof(IsDevelopment));
if (appSettings.IsStaging is null) throw new NullReferenceException(nameof(IsStaging));
if (appSettings.MockRoot is null) throw new NullReferenceException(nameof(MockRoot));
if (appSettings.MonAResource is null) throw new NullReferenceException(nameof(MonAResource));
if (appSettings.MonASite is null) throw new NullReferenceException(nameof(MonASite));
if (appSettings.OpenInsightApplicationProgrammingInterface is null) throw new NullReferenceException(nameof(OpenInsightApplicationProgrammingInterface));
if (appSettings.URLs is null) throw new NullReferenceException(nameof(URLs));
if (appSettings.TableToPath is null) throw new NullReferenceException(nameof(TableToPath));
if (appSettings.WaferCounterDestinationDirectory is null) throw new NullReferenceException(nameof(WaferCounterDestinationDirectory));
if (appSettings.WaferCounterTwoFileSecondsWait is null) throw new NullReferenceException(nameof(WaferCounterTwoFileSecondsWait));
if (appSettings.WorkingDirectoryName is null) throw new NullReferenceException(nameof(WorkingDirectoryName));
result = new(
appSettings.ApiFileShare,
appSettings.ApiLoggingContentTypes,
appSettings.ApiLoggingPathPrefixes,
appSettings.ApiLogPath,
appSettings.ApiUrl,
appSettings.BuildNumber,
appSettings.Company,
appSettings.ConnectionString,
appSettings.EcCharacterizationSi,
appSettings.EcMesaFileShareCharacterizationSi,
appSettings.EcMesaFileShareMetrologySi,
appSettings.EcMetrologySi,
appSettings.GitCommitSeven,
appSettings.InboundApiAllowedIPList,
appSettings.IqsColumns,
appSettings.IqsFileSegments,
appSettings.IqsKey,
appSettings.IqsRed,
appSettings.IqsYellow,
appSettings.IsDevelopment.Value,
appSettings.IsStaging.Value,
appSettings.MockRoot,
appSettings.MonAResource,
appSettings.MonASite,
appSettings.OpenInsightApplicationProgrammingInterface,
appSettings.TableToPath,
appSettings.URLs,
appSettings.WaferCounterDestinationDirectory,
appSettings.WaferCounterTwoFileSecondsWait.Value,
appSettings.WorkingDirectoryName);
return result;
}
public static Models.AppSettings Get(IConfigurationRoot configurationRoot)
{
Models.AppSettings result;
#pragma warning disable IL3050, IL2026
AppSettings? appSettings = configurationRoot.Get<AppSettings>();
#pragma warning restore IL3050, IL2026
PreVerify(configurationRoot, appSettings);
result = Get(appSettings);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(AppSettings))]
internal partial class BinderAppSettingsSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -0,0 +1,151 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup Label="Globals">
<SccProjectName>SAK</SccProjectName>
<SccProvider>SAK</SccProvider>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
</PropertyGroup>
<PropertyGroup>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<ImplicitUsings>enable</ImplicitUsings>
<IsPackable>false</IsPackable>
<Nullable>enable</Nullable>
<OutputType>Exe</OutputType>
<RuntimeIdentifiers>win-x64;linux-x64</RuntimeIdentifiers>
<TargetFramework>net8.0</TargetFramework>
<UserSecretsId>b0a3891c-b775-422c-80ee-63a2f385045d</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<Compile Remove="logs\**" />
<Content Remove="logs\**" />
<EmbeddedResource Remove="logs\**" />
<None Remove="logs\**" />
</ItemGroup>
<ItemGroup>
<Content Remove="compilerconfig.json" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.1.44" />
<PackageReference Include="EntityFramework" Version="6.5.1" />
<PackageReference Include="jQuery" Version="3.7.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.7" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
<PackageReference Include="System.Drawing.Common" Version="8.0.7" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="moves\" />
<Folder Include="wwwroot\images\" />
<Folder Include="wwwroot\styles\" />
</ItemGroup>
<ItemGroup>
<None Include="compilerconfig.json" />
</ItemGroup>
<ItemGroup>
<None Include="Data\Mike\service-shop.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\AppSettings-GetAppSettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\AppSettings-GetBuildNumberAndGitCommitSeven.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\ClientSettings-GetClientSettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\ClientSettings-GetIpAddress.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\Export-GetExport.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\Export-GetHeaders.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\Export-GetLogistics.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\Export-GetProcessDataStandardFormat.pdsf">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQS-GetCommandText.sql">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV2-GetCommandText.sql">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV2-GetData.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV2-GetDescriptors.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV2-GetEvents.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV2-GetHeader.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV3-GetData.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV3-GetDescriptors.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</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">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\InfinityQSV3-GetProductDataAverageSumOfDefectsProcessMeanProcessSigma.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\OpenInsightV1-GetTencorRun.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\Pin-GetPinnedTable.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\Reactors-GetReactors.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\ServiceShopOrder-GetAllServiceShopOrders.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\ToolTypes-GetData.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\ToolTypes-GetHeaderFields.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\ToolTypes-GetHeaders.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\ToolTypes-GetHeaderTitles.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\ToolTypes-GetToolTypeMetadata.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="Data\Tests\ToolTypes-Index.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -1,22 +1,15 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Hosting.WindowsServices;
using Microsoft.Extensions.Logging;
using OI.Metrology.Shared.Models;
using OI.Metrology.Server.Models;
using OI.Metrology.Server.Repositories;
using OI.Metrology.Server.Repository;
using OI.Metrology.Server.Services;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories;
using OI.Metrology.Shared.Services;
using OI.Metrology.Viewer.Models;
using OI.Metrology.Viewer.Repositories;
using OI.Metrology.Viewer.Services;
using Serilog;
using System;
using System.IO;
using System.Reflection;
namespace OI.Metrology.Viewer;
namespace OI.Metrology.Server;
public class Program
{
@ -25,7 +18,7 @@ public class Program
{
string webRootPath;
Assembly assembly = Assembly.GetExecutingAssembly();
string assemblyName = assembly.GetName()?.Name;
string? assemblyName = assembly.GetName()?.Name;
if (string.IsNullOrEmpty(assemblyName))
throw new Exception();
string baseAssemblyName = assemblyName.Split('.')[0];
@ -46,31 +39,47 @@ public class Program
public static int Main(string[] args)
{
LoggerConfiguration loggerConfiguration = new();
ILogger<Program>? logger = null;
(string assemblyName, WebApplicationOptions _) = Get(args);
WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args);
_ = webApplicationBuilder.Configuration.AddUserSecrets<Program>();
AppSettings appSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration);
if (string.IsNullOrEmpty(appSettings.Company))
throw new Exception("Company name must have a value!");
if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName))
throw new Exception("Working directory name must have a value!");
string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assemblyName, appSettings.WorkingDirectoryName);
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
{
_ = webApplicationBuilder.Services.AddMemoryCache();
_ = webApplicationBuilder.Services.Configure<ApiBehaviorOptions>(options => options.SuppressModelStateInvalidFilter = true);
_ = webApplicationBuilder.Services.AddControllersWithViews();
_ = new MetrologyRepo(new SQLDbConnectionFactory(appSettings), null);
_ = webApplicationBuilder.Services.AddDistributedMemoryCache();
_ = webApplicationBuilder.Services.AddMemoryCache();
_ = webApplicationBuilder.Services.AddSingleton<AppSettings, AppSettings>(_ => appSettings);
AppSettingsRepository appSettingsRepository = new(appSettings);
SQLDbConnectionFactory sqlDbConnectionFactory = new(appSettings);
ClientSettingsRepository clientSettingsRepository = new(appSettings);
_ = webApplicationBuilder.Services.AddHttpClient();
_ = webApplicationBuilder.Services.AddSingleton(_ => appSettings);
_ = webApplicationBuilder.Services.AddSingleton<IPinRepository, PinRepository>();
_ = webApplicationBuilder.Services.AddScoped<IExportRepository, ExportRepository>();
_ = webApplicationBuilder.Services.AddScoped<IAttachmentsService, AttachmentsService>();
_ = webApplicationBuilder.Services.AddScoped<IInboundDataService, InboundDataService>();
_ = webApplicationBuilder.Services.AddScoped<IMetrologyRepo, MetrologyRepo>();
_ = webApplicationBuilder.Services.AddSingleton<IDbConnectionFactory, SQLDbConnectionFactory>();
_ = webApplicationBuilder.Services.AddSingleton<IInboundRepository, InboundRepository>();
_ = webApplicationBuilder.Services.AddScoped<IMetrologyRepository, MetrologyRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IFileShareRepository, FileShareRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IToolTypesRepository, ToolTypesRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSRepository, InfinityQSRepository>();
_ = webApplicationBuilder.Services.AddScoped<IOpenInsightV1Repository, OpenInsightV1Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV2Repository, InfinityQSV2Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV3Repository, InfinityQSV3Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV4Repository, InfinityQSV4Repository>();
_ = 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.AddSession(sessionOptions =>
{
@ -84,14 +93,19 @@ public class Program
_ = webApplicationBuilder.Services.AddSingleton<IHostLifetime, WindowsServiceLifetime>();
_ = webApplicationBuilder.Logging.AddEventLog(settings =>
{
#pragma warning disable CA1416
if (string.IsNullOrEmpty(settings.SourceName))
settings.SourceName = webApplicationBuilder.Environment.ApplicationName;
#pragma warning restore
});
}
WebApplication webApplication = webApplicationBuilder.Build();
logger = webApplication.Services.GetRequiredService<ILogger<Program>>();
_ = webApplication.UseCors(corsPolicyBuilder => corsPolicyBuilder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
if (!webApplicationBuilder.Environment.IsDevelopment())
{
_ = webApplication.UseExceptionHandler("/Error");
_ = webApplication.UseHttpsRedirection();
_ = webApplication.UseHsts();
}
else
@ -102,29 +116,23 @@ public class Program
webApplication.Lifetime.StopApplication();
}
_ = webApplication.UseSwagger();
_ = webApplication.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Viewer V1"));
_ = webApplication.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Server V1"));
}
_ = webApplication.Lifetime.ApplicationStopped.Register(Log.CloseAndFlush);
_ = ApplicationBuilderSerilogClientExtensions.UseSerilogIngestion(webApplication);
_ = SerilogApplicationBuilderExtensions.UseSerilogRequestLogging(webApplication);
_ = webApplication.UseFileServer(enableDirectoryBrowsing: true);
_ = webApplication.UseStaticFiles();
_ = webApplication.UseSession();
_ = webApplication.UseHttpsRedirection();
_ = webApplication.UseMiddleware<ApiLoggingMiddleware>();
_ = webApplication.MapControllers();
log.Information("Starting Web Application");
logger.LogInformation("Starting Web Application");
webApplication.Run();
return 0;
}
catch (Exception ex)
{
log.Fatal(ex, "Host terminated unexpectedly");
return 1;
}
finally
{
Log.CloseAndFlush();
try
{ logger?.LogCritical(ex, "Host terminated unexpectedly"); }
catch (Exception) { }
throw;
}
}

View File

@ -0,0 +1,31 @@
{
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "http://localhost:5126",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "https://localhost:7130;http://localhost:5126",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https-prod": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "https://localhost:7130;http://localhost:5126",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
}
}
}
}

View File

@ -0,0 +1,52 @@
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.Models.Stateless;
namespace OI.Metrology.Server.Repository;
public class AppSettingsRepository : IAppSettingsRepository<Models.Binder.AppSettings>
{
private readonly AppSettings _AppSettings;
public AppSettingsRepository(AppSettings appSettings) => _AppSettings = appSettings;
internal Models.Binder.AppSettings GetAppSettings()
{
Models.Binder.AppSettings result = new()
{
BuildNumber = _AppSettings.BuildNumber,
Company = _AppSettings.Company,
GitCommitSeven = _AppSettings.GitCommitSeven,
IsDevelopment = _AppSettings.IsDevelopment,
IsStaging = _AppSettings.IsStaging,
};
return result;
}
Models.Binder.AppSettings IAppSettingsRepository<Models.Binder.AppSettings>.GetAppSettings() => GetAppSettings();
internal string GetBuildNumberAndGitCommitSeven()
{
string result = string.Concat(_AppSettings.BuildNumber, '-', _AppSettings.GitCommitSeven);
return result;
}
internal void VerifyConnectionStrings()
{
if (string.IsNullOrEmpty(_AppSettings.ConnectionString))
throw new NotSupportedException();
#if DEBUG
if (!_AppSettings.ConnectionString.Contains("test", StringComparison.CurrentCultureIgnoreCase))
throw new NotSupportedException();
#endif
#if !DEBUG
if (_AppSettings.ConnectionString.Contains("test", StringComparison.CurrentCultureIgnoreCase))
throw new NotSupportedException();
#endif
}
string IAppSettingsRepository<Models.Binder.AppSettings>.GetBuildNumberAndGitCommitSeven() => GetBuildNumberAndGitCommitSeven();
void IAppSettingsRepository<Models.Binder.AppSettings>.VerifyConnectionStrings() => VerifyConnectionStrings();
}

View File

@ -0,0 +1,32 @@
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.Models.Stateless;
using System.Net;
namespace OI.Metrology.Server.Repository;
public class ClientSettingsRepository : IClientSettingsRepository
{
private readonly AppSettings _AppSettings;
public ClientSettingsRepository(AppSettings appSettings) => _AppSettings = appSettings;
internal List<string> GetClientSettings(IPAddress? remoteIpAddress)
{
List<string> results = new() { remoteIpAddress is null ? nameof(remoteIpAddress) : remoteIpAddress.ToString() };
if (!_AppSettings.IsDevelopment)
throw new Exception("Shouldn't expose!");
return results;
}
internal static string GetIpAddress(IPAddress? remoteIpAddress)
{
string result = remoteIpAddress is null ? string.Empty : remoteIpAddress.ToString();
return result;
}
List<string> IClientSettingsRepository.GetClientSettings(IPAddress? remoteIpAddress) => GetClientSettings(remoteIpAddress);
string IClientSettingsRepository.GetIpAddress(IPAddress? remoteIpAddress) => GetIpAddress(remoteIpAddress);
}

View File

@ -0,0 +1,247 @@
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using System.Data;
using System.Globalization;
using System.Text;
using System.Text.Json;
namespace OI.Metrology.Server.Repository;
public class ExportRepository : IExportRepository
{
private readonly string _RepositoryName;
private readonly AppSettings _AppSettings;
private readonly ILogger<ExportRepository> _Logger;
private readonly IHttpClientFactory _HttpClientFactory;
private readonly IFileShareRepository _FileShareRepository;
private readonly Dictionary<string, Dictionary<long, HeaderCommon>> _RdsToHeaderCommonCollection;
public ExportRepository(ILogger<ExportRepository> logger, AppSettings appSettings, IHttpClientFactory httpClientFactory, IFileShareRepository fileShareRepository)
{
_Logger = logger;
_AppSettings = appSettings;
_RdsToHeaderCommonCollection = new();
_HttpClientFactory = httpClientFactory;
_FileShareRepository = fileShareRepository;
_RepositoryName = nameof(ExportRepository)[..^10];
}
private static string[] Get()
{
DateTime dateTime = DateTime.Now;
DateTime lastWeekDateTime = dateTime.AddDays(-7);
Calendar calendar = new CultureInfo("en-US").Calendar;
string weekOfYear = $"{dateTime:yyyy}_Week_{calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday):00}";
string lastWeekOfYear = $"{lastWeekDateTime:yyyy}_Week_{calendar.GetWeekOfYear(lastWeekDateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday):00}";
return new string[] { weekOfYear, lastWeekOfYear };
}
private NginxFileSystemSortable[] GetNginxFileSystemSortableCollection(HeaderCommon headerCommon, HttpClient httpClient, string endsWith)
{
List<NginxFileSystemSortable> results = new();
Uri uri;
string[] weeks = Get();
List<NginxFileSystemSortable> nginxFileSystemSortableCollection;
foreach (string weekYear in weeks)
{
if (headerCommon.ID < 1)
uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareMetrologySi), "Archive", "API", weekYear, $"-{headerCommon.PSN}", $"-{headerCommon.Reactor}", $"-{headerCommon.RDS}");
else
uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareMetrologySi), "Archive", "API", weekYear, $"-{headerCommon.PSN}", $"-{headerCommon.Reactor}", $"-{headerCommon.RDS}", $"-{headerCommon.ID}");
nginxFileSystemSortableCollection = _FileShareRepository.GetNginxFileSystemSortableCollection(httpClient, uri, endsWith);
results.AddRange(nginxFileSystemSortableCollection);
}
return results.OrderByDescending(l => l.DateTime).ToArray();
}
private string GetLines(HttpClient httpClient, NginxFileSystemSortable[] nginxFileSystemSortableCollection)
{
string result;
if (nginxFileSystemSortableCollection.Length != 1)
result = string.Empty;
else
{
HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, nginxFileSystemSortableCollection.First().Uri);
if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception("File not found!");
Task<string> lines = httpResponseMessage.Content.ReadAsStringAsync();
lines.Wait();
result = lines.Result;
}
return result;
}
string IExportRepository.GetExport(HeaderCommon headerCommon)
{
string result;
HttpClient httpClient = _HttpClientFactory.CreateClient();
NginxFileSystemSortable[] nginxFileSystemSortableCollection = GetNginxFileSystemSortableCollection(headerCommon, httpClient, ".txt");
result = GetLines(httpClient, nginxFileSystemSortableCollection);
return result;
}
Result<HeaderCommon[]> IExportRepository.GetHeaders(HeaderCommon headerCommon)
{
Result<HeaderCommon[]>? result;
List<HeaderCommon> results = new();
string json;
HeaderCommon? hc;
string? directory;
string directoryName;
JsonElement? jsonElement;
const string ticks = "Ticks";
JsonProperty[] jsonProperties;
HttpClient httpClient = _HttpClientFactory.CreateClient();
NginxFileSystemSortable[] nginxFileSystemSortableCollection = GetNginxFileSystemSortableCollection(headerCommon, httpClient, ".json");
foreach (NginxFileSystemSortable nginxFileSystemSortable in nginxFileSystemSortableCollection)
{
json = GetLines(httpClient, nginxFileSystemSortableCollection);
hc = JsonSerializer.Deserialize<HeaderCommon>(json);
if (hc is null)
continue;
if (hc.ID < 1)
{
directory = Path.GetDirectoryName(nginxFileSystemSortable.Uri.OriginalString);
if (directory is null)
continue;
directoryName = Path.GetFileName(directory);
if (directoryName.Length < 1 || directoryName[0] != '-' || !long.TryParse(directoryName[1..], out long id))
continue;
hc.ID = id;
}
jsonElement = JsonSerializer.Deserialize<JsonElement>(json);
if (jsonElement is not null && jsonElement.Value.ValueKind == JsonValueKind.Object)
{
jsonProperties = (from l in jsonElement.Value.EnumerateObject() where l.Name == ticks select l).ToArray();
if (jsonProperties.Length != 0 && long.TryParse(jsonProperties[0].Value.ToString(), out long ticksValue))
hc.Date = new(ticksValue);
}
results.Add(hc);
}
result = new()
{
Results = results.ToArray(),
TotalRows = results.Count,
};
return result;
}
Result<HeaderCommon[]> IExportRepository.GetLogistics(HeaderCommon headerCommon)
{
Result<HeaderCommon[]>? result;
List<HeaderCommon> results = new();
string json;
HeaderCommon? hc;
HttpClient httpClient = _HttpClientFactory.CreateClient();
NginxFileSystemSortable[] nginxFileSystemSortableCollection = GetNginxFileSystemSortableCollection(headerCommon, httpClient, ".json");
foreach (NginxFileSystemSortable nginxFileSystemSortable in nginxFileSystemSortableCollection)
{
json = GetLines(httpClient, nginxFileSystemSortableCollection);
hc = JsonSerializer.Deserialize<HeaderCommon>(json);
if (hc is null)
continue;
results.Add(hc);
}
result = new()
{
Results = results.ToArray(),
TotalRows = results.Count,
};
return result;
}
string IExportRepository.GetProcessDataStandardFormat(HeaderCommon headerCommon)
{
string result;
HttpClient httpClient = _HttpClientFactory.CreateClient();
NginxFileSystemSortable[] nginxFileSystemSortableCollection = GetNginxFileSystemSortableCollection(headerCommon, httpClient, ".pdsf");
result = GetLines(httpClient, nginxFileSystemSortableCollection);
return result;
}
Result<DataTable> IExportRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
{
Result<DataTable>? r;
DateTime dateEnd = dateend is null ? DateTime.Now : DateTime.Parse(dateend);
DateTime dateBegin = datebegin is null ? dateEnd.AddMonths(-1) : DateTime.Parse(datebegin);
ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId);
if (string.IsNullOrEmpty(tt.ExportSPName))
throw new NullReferenceException(nameof(tt.ExportSPName));
DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, dateBegin, dateEnd);
r = new()
{
Results = dataTable,
TotalRows = dataTable.Rows.Count,
};
return r;
}
protected static string FormatForCSV(string v)
{
StringBuilder result = new(v.Length + 2);
bool doubleQuoted = false;
if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"'))
{
_ = result.Append('"');
doubleQuoted = true;
}
foreach (char c in v)
{
_ = c switch
{
'\r' or '\n' => result.Append(' '),
'"' => result.Append("\"\""),
_ => result.Append(c),
};
}
if (doubleQuoted)
_ = result.Append('"');
return result.ToString();
}
protected static string GetColumnHeaders(DataTable dataTable)
{
StringBuilder result = new();
for (int i = 0; i < dataTable.Columns.Count; i++)
{
if (i > 0)
_ = result.Append(',');
_ = result.Append(FormatForCSV(dataTable.Columns[i].ColumnName.TrimEnd('_')));
}
return result.ToString();
}
protected static string GetRowData(DataRow dr)
{
StringBuilder result = new();
for (int i = 0; i < dr.Table.Columns.Count; i++)
{
if (i > 0)
_ = result.Append(',');
object v = dr[i];
if (v is not null && !Convert.IsDBNull(v))
_ = result.Append(FormatForCSV(string.Concat(Convert.ToString(v))));
}
return result.ToString();
}
string IExportRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
{
string results;
Result<DataTable> result;
IExportRepository repository = this;
result = repository.GetExportData(metrologyRepository, toolTypeId, datebegin, dateend);
if (result.Results is null)
throw new NullReferenceException(nameof(result.Results));
StringBuilder stringBuilder = new();
_ = stringBuilder.AppendLine(GetColumnHeaders(result.Results));
foreach (DataRow dr in result.Results.Rows)
_ = stringBuilder.AppendLine(GetRowData(dr));
results = stringBuilder.ToString();
return results;
}
}

View File

@ -0,0 +1,106 @@
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using System.Text.Json;
using System.Web;
namespace OI.Metrology.Server.Repository;
public class FileShareRepository : IFileShareRepository
{
Uri IFileShareRepository.Append(Uri uri, params string[] paths) =>
new(paths.Aggregate(uri.AbsoluteUri, (current, path) => string.Format("{0}/{1}", current.TrimEnd('/'), path.TrimStart('/'))));
private Uri GetEndPoint(HttpClient httpClient, string method)
{
Uri result;
if (httpClient.BaseAddress is null)
throw new NullReferenceException(nameof(httpClient.BaseAddress));
IFileShareRepository fileShareRepository = this;
result = fileShareRepository.Append(httpClient.BaseAddress, "api", "v1", "file-share", method);
return result;
}
void IFileShareRepository.CopyFile(string from, string to)
{
string directory = Path.GetDirectoryName(to) ?? throw new NullReferenceException();
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
File.Copy(from, to);
}
void IFileShareRepository.MoveFile(string from, string to)
{
string directory = Path.GetDirectoryName(to) ?? throw new NullReferenceException();
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
if (File.Exists(to))
File.Move(to, $"{to}.{DateTime.Now.Ticks}.old");
File.Move(from, to);
}
void IFileShareRepository.FileWrite(string path, string contents)
{
string directory = Path.GetDirectoryName(path) ?? throw new NullReferenceException();
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
File.WriteAllText(path, contents);
}
void IFileShareRepository.CopyFile(HttpClient httpClient, string from, string to)
{
Uri uri = GetEndPoint(httpClient, "copy-file");
string encodedTo = HttpUtility.UrlEncode(to);
string encodedFrom = HttpUtility.UrlEncode(from);
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync($"{uri.OriginalString}?from={encodedFrom}&to={encodedTo}");
httpResponseMessage.Wait();
if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception(httpResponseMessage.Result.StatusCode.ToString());
}
void IFileShareRepository.MoveFile(HttpClient httpClient, string from, string to)
{
Uri uri = GetEndPoint(httpClient, "move-file");
string encodedTo = HttpUtility.UrlEncode(to);
string encodedFrom = HttpUtility.UrlEncode(from);
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync($"{uri.OriginalString}?from={encodedFrom}&to={encodedTo}");
httpResponseMessage.Wait();
if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception(httpResponseMessage.Result.StatusCode.ToString());
}
HttpResponseMessage IFileShareRepository.ReadFile(HttpClient httpClient, Uri uri)
{
HttpResponseMessage result;
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri);
httpResponseMessage.Wait();
result = httpResponseMessage.Result;
return result;
}
List<NginxFileSystemSortable> IFileShareRepository.GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith)
{
List<NginxFileSystemSortable> results = new();
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri);
httpResponseMessage.Wait();
if (httpResponseMessage.Result.StatusCode == System.Net.HttpStatusCode.OK)
{
FileShareRepository fileShareRepository = this;
Task<string> json = httpResponseMessage.Result.Content.ReadAsStringAsync();
json.Wait();
NginxFileSystem[]? nginxFileSystemCollection = JsonSerializer.Deserialize(json.Result, NginxFileSystemCollectionSourceGenerationContext.Default.NginxFileSystemArray);
List<NginxFileSystemSortable> nginxFileSystemSortableCollection = NginxFileSystemSortable.Convert(fileShareRepository, uri, nginxFileSystemCollection);
foreach (NginxFileSystemSortable nginxFileSystemSortable in nginxFileSystemSortableCollection.OrderByDescending(l => l.DateTime))
{
if (!string.IsNullOrEmpty(endsWith) && !nginxFileSystemSortable.Name.EndsWith(endsWith))
continue;
results.Add(nginxFileSystemSortable);
}
}
return results;
}
List<CharacterizationInfo> IFileShareRepository.GetArchiveData(CharacterizationParameters archiveParameters) =>
throw new NotImplementedException();
}

View File

@ -0,0 +1,72 @@
using Newtonsoft.Json.Linq;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services;
using System.Net;
using System.Text.Json;
namespace OI.Metrology.Server.Repository;
public class InboundRepository : IInboundRepository
{
bool IInboundRepository.IsIPAddressAllowed(string inboundApiAllowedIPList, IPAddress? remoteIP)
{
if (string.IsNullOrWhiteSpace(inboundApiAllowedIPList))
return true;
if (remoteIP is null)
return false;
byte[] remoteIPBytes = remoteIP.GetAddressBytes();
string[] allowedIPs = inboundApiAllowedIPList.Split(';');
foreach (string ip in allowedIPs)
{
IPAddress? parsedIP;
if (IPAddress.TryParse(ip, out parsedIP))
{
if (parsedIP.GetAddressBytes().SequenceEqual(remoteIPBytes))
return true;
}
}
return false;
}
DataResponse IInboundRepository.Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string toolTypeName, JsonElement? jsonElement)
{
DataResponse result = new();
if (jsonElement is null || jsonElement.Value.ValueKind != JsonValueKind.Object)
throw new Exception("Invalid body!");
string? json = jsonElement.ToString();
JToken jToken = (string.IsNullOrEmpty(json) ? JToken.Parse("{}") : JToken.Parse(json)) ??
throw new Exception($"Invalid body: {json}");
ToolType toolType = metrologyRepository.GetToolTypeByName(toolTypeName) ??
throw new Exception($"Invalid tool type: {toolTypeName}");
List<ToolTypeMetadata> metaData = metrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList();
inboundDataService.ValidateJSONFields(jToken, 0, metaData, result.Errors, result.Warnings);
if (result.Errors.Count == 0)
{
try
{
result.HeaderID = inboundDataService.DoSQLInsert(jToken, toolType, metaData);
result.Success = result.HeaderID > 0;
}
catch (Exception ex) { result.Errors.Add(ex.Message); }
}
return result;
}
void IInboundRepository.AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string toolTypeName, Attachment? attachment)
{
if (attachment is null)
throw new Exception("Invalid body!");
ToolType toolType = metrologyRepository.GetToolTypeByName(toolTypeName) ??
throw new Exception($"Invalid tool type: {toolTypeName}");
if (string.IsNullOrWhiteSpace(attachment.DestinationFileName))
throw new Exception("Empty filename");
if (attachment.DestinationFileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
throw new Exception("Invalid filename");
attachmentsService.SaveAttachment(toolType, attachment);
}
}

View File

@ -0,0 +1,285 @@
using OI.Metrology.Server.Models;
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;
namespace OI.Metrology.Server.Repository;
public class InfinityQSRepository : IInfinityQSRepository
{
private readonly string _MockRoot;
private readonly string _RepositoryName;
private readonly IDbConnectionFactory _DBConnectionFactory;
public InfinityQSRepository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory)
{
_MockRoot = appSettings.MockRoot;
_DBConnectionFactory = dbConnectionFactory;
_RepositoryName = nameof(InfinityQSRepository)[..^10];
}
string IInfinityQSRepository.GetCommandText(string subGroupId)
{
StringBuilder result = new();
if (string.IsNullOrEmpty(subGroupId))
throw new ArgumentException(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();
}
string IInfinityQSRepository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime)
{
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(nameof(dateTime));
_ = result
.AppendLine(" 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 ")
.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(" (select count(cl.f_part) ")
.AppendLine(" from [spcepiworld].[dbo].[ctrl_lim] cl ")
.AppendLine(" where cl.f_part = pd.f_part ")
.AppendLine(" and cl.f_test = td.f_test ")
.AppendLine(" ) cl_count, ")
.AppendLine(" (select count(sl.f_part) ")
.AppendLine(" from [spcepiworld].[dbo].[spec_lim] sl ")
.AppendLine(" where sl.f_part = pd.f_part ")
.AppendLine(" and sl.f_test = td.f_test ")
.AppendLine(" ) sl_count, ")
.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(" where se.f_flag = 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 ");
_ = result.AppendLine(" order by iq.ev_count desc, iq.cl_count desc, iq.sl_count desc, iq.se_sgrp, iq.se_tsno, iq.td_test ");
_ = result.AppendLine(" for json path ");
return result.ToString();
}
private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText)
{
StringBuilder stringBuilder = new();
using DbConnection dbConnection = dbConnectionFactory.GetDbConnection();
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 InfinityQSBase GetInfinityQSBase(IDbConnectionFactory dbConnectionFactory, IInfinityQSRepository infinityQSRepository, string subGroupId)
{
InfinityQSBase result;
string commandText = infinityQSRepository.GetCommandText(subGroupId, process: string.Empty, job: string.Empty, part: string.Empty, lot: string.Empty, dateTime: string.Empty);
StringBuilder stringBuilder = GetForJsonPath(dbConnectionFactory, commandText);
InfinityQSBase[]? results = JsonSerializer.Deserialize<InfinityQSBase[]>(stringBuilder.ToString(), new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
if (results is null)
throw new NullReferenceException(nameof(results));
// if (results.Select(l => l.SE_SGRP).Distinct().Count() != 1)
// throw new NotSupportedException("Multiple ids are present!");
result = (from l in results orderby l.SE_SGRP, l.SE_TSNO, l.TD_TEST select l).First();
return result;
}
Result<InfinityQSBase[]> IInfinityQSRepository.GetData(string subGroupId)
{
Result<InfinityQSBase[]>? result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSRepository.GetData)}.json"));
result = JsonSerializer.Deserialize<Result<InfinityQSBase[]>>(json);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
IInfinityQSRepository infinityQSRepository = this;
InfinityQSBase infinityQSBase = GetInfinityQSBase(_DBConnectionFactory, infinityQSRepository, subGroupId);
string commandText = infinityQSRepository.GetCommandText(subGroupId, process: infinityQSBase.PR_NAME, job: infinityQSBase.JD_NAME, part: infinityQSBase.PD_NAME, lot: infinityQSBase.PL_NAME, dateTime: string.Concat(infinityQSBase.SE_SGTM));
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText);
InfinityQSBase[]? results = JsonSerializer.Deserialize<InfinityQSBase[]>(stringBuilder.ToString(), new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
if (results is null)
throw new NullReferenceException(nameof(results));
result = new()
{
Results = results,
TotalRows = results.Length,
};
}
return result;
}
Result<InfinityQSDescriptor[]> IInfinityQSRepository.GetDescriptors(string subGroupId)
{
Result<InfinityQSDescriptor[]>? result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSRepository.GetDescriptors)}.json"));
result = JsonSerializer.Deserialize<Result<InfinityQSDescriptor[]>>(json);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
IInfinityQSRepository infinityQSRepository = this;
string commandText = infinityQSRepository.GetCommandText(subGroupId);
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText);
InfinityQSDescriptor[]? results = JsonSerializer.Deserialize<InfinityQSDescriptor[]>(stringBuilder.ToString(), new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
if (results is null)
throw new NullReferenceException(nameof(results));
result = new()
{
Results = results,
TotalRows = results.Length,
};
}
return result;
}
string IInfinityQSRepository.GetCommandText(InfinityQSBase infinityQSBase)
{
StringBuilder result = new();
if (string.IsNullOrEmpty(infinityQSBase.PR_NAME))
throw new ArgumentException(nameof(infinityQSBase.PR_NAME));
if (string.IsNullOrEmpty(infinityQSBase.PD_NAME))
throw new ArgumentException(nameof(infinityQSBase.PD_NAME));
_ = 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(infinityQSBase.PR_NAME).AppendLine("' ")
.Append(" and pd.f_name = '").Append(infinityQSBase.PD_NAME).AppendLine("' ")
.Append(" and ev.f_sgtm = ").Append(infinityQSBase.SE_SGTM).AppendLine(" ")
.AppendLine(" for json path ");
return result.ToString();
}
Result<InfinityQSEvent[]> IInfinityQSRepository.GetEvents(string subGroupId)
{
Result<InfinityQSEvent[]>? result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSRepository.GetEvents)}.json"));
result = JsonSerializer.Deserialize<Result<InfinityQSEvent[]>>(json);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
InfinityQSEvent[]? results;
IInfinityQSRepository infinityQSRepository = this;
InfinityQSBase infinityQSBase = GetInfinityQSBase(_DBConnectionFactory, infinityQSRepository, subGroupId);
if (infinityQSBase.EV_COUNT <= 0)
results = Array.Empty<InfinityQSEvent>();
else
{
string commandText = infinityQSRepository.GetCommandText(infinityQSBase);
StringBuilder stringBuilder = GetForJsonPath(_DBConnectionFactory, commandText);
results = JsonSerializer.Deserialize<InfinityQSEvent[]>(stringBuilder.ToString(), new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
if (results is null)
throw new NullReferenceException(nameof(results));
}
result = new()
{
Results = results,
TotalRows = results.Length,
};
}
return result;
}
Result<InfinityQSBase[]> IInfinityQSRepository.GetHeader(string subGroupId)
{
Result<InfinityQSBase[]>? result;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSRepository.GetHeader)}.json"));
result = JsonSerializer.Deserialize<Result<InfinityQSBase[]>>(json);
if (result is null)
throw new NullReferenceException(nameof(result));
}
else
{
IInfinityQSRepository infinityQSRepository = this;
InfinityQSBase infinityQSBase = GetInfinityQSBase(_DBConnectionFactory, infinityQSRepository, subGroupId);
InfinityQSBase[] results = new InfinityQSBase[] { infinityQSBase };
result = new()
{
Results = results,
TotalRows = results.Length,
};
}
return result;
}
}

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