Compare commits
54 Commits
831dd58078
...
02-21-a
Author | SHA1 | Date | |
---|---|---|---|
0a529a0206 | |||
141f9c084a | |||
018382e218 | |||
4c2bef71ec | |||
b824c4ba36 | |||
1ad6246b8d | |||
478aecf2c8 | |||
fe3292133e | |||
e7b721fdb3 | |||
da3e839a48 | |||
6737ddfb59 | |||
3aed250488 | |||
f53ae8c1c8 | |||
6317c385f6 | |||
5c9f0d1aff | |||
7e16ee7f98 | |||
cff2e06f68 | |||
03bd20fc8c | |||
3dd4034a84 | |||
f684c4b7ef | |||
4cc5219409 | |||
6668806432 | |||
e084fdd58f | |||
6b409294e4 | |||
9774b0cc53 | |||
c82a8790e7 | |||
c68b853c64 | |||
2f3f1b7947 | |||
c655ed5c6b | |||
70c1e1a52a | |||
72b648589e | |||
66f38fcf33 | |||
994556d453 | |||
8040a7c6b5 | |||
de048b6842 | |||
db44756142 | |||
66f9347223 | |||
a0d0f33c83 | |||
1712743c46 | |||
bff76a503a | |||
97c9c3c264 | |||
8e15b6a3a5 | |||
f3d199cccb | |||
a25dc93610 | |||
5c50078c04 | |||
5f7450e442 | |||
617a4989e2 | |||
466057022d | |||
1e834360ae | |||
f36ad1ae5e | |||
672b439864 | |||
f9db1ab67c | |||
be895557d5 | |||
61692f2c48 |
5162
.Data/RdsMaxRepo.json
Normal file
5162
.Data/RdsMaxRepo.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -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,14 +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.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
|
||||
@ -215,7 +246,7 @@ 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_predefined_type_for_member_access = true:warning
|
||||
dotnet_style_prefer_auto_properties = true:warning
|
||||
dotnet_style_prefer_compound_assignment = true:warning
|
||||
dotnet_style_prefer_conditional_expression_over_assignment = false
|
||||
|
10
.gitignore
vendored
10
.gitignore
vendored
@ -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
266
.groovy
@ -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
53
.vscode/launch.json
vendored
@ -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",
|
||||
|
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@ -2,5 +2,8 @@
|
||||
"cSpell.enabled": false,
|
||||
"files.exclude": {
|
||||
"**/.git": false
|
||||
}
|
||||
},
|
||||
"thunder-client.saveToWorkspace": false,
|
||||
"thunder-client.workspaceRelativePath": ".vscode",
|
||||
"coverage-gutters.coverageBaseDir": "../.vscode/TestResults/*"
|
||||
}
|
193
.vscode/tasks.json
vendored
193
.vscode/tasks.json
vendored
@ -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
243
Archive/.editorconfig
Normal 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
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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');
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Infineon.Monitoring.MonA;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
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;
|
||||
@ -16,12 +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);
|
||||
}
|
||||
|
||||
@ -37,10 +40,11 @@ public class ExportController : Controller
|
||||
{
|
||||
Export model = new()
|
||||
{
|
||||
ToolType = "",
|
||||
StartTime = DateTime.Now.AddMonths(-1),
|
||||
EndTime = DateTime.Now
|
||||
};
|
||||
MonIn monIn = MonIn.GetInstance();
|
||||
_ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Up);
|
||||
return View(model);
|
||||
}
|
||||
|
||||
@ -48,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
|
||||
{
|
||||
@ -77,6 +81,8 @@ public class ExportController : Controller
|
||||
ModelState.AddModelError("Exception", ex.Message);
|
||||
string errorMessage = $"Error exporting: {ex}";
|
||||
_Logger.LogError(message: errorMessage);
|
||||
MonIn monIn = MonIn.GetInstance();
|
||||
_ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Warning);
|
||||
}
|
||||
}
|
||||
return View("Index", model);
|
||||
@ -87,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));
|
||||
|
||||
@ -108,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();
|
||||
}
|
||||
|
@ -1,20 +1,24 @@
|
||||
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;
|
||||
|
||||
namespace OI.Metrology.Archive.Controllers;
|
||||
|
||||
public class PagesController : Controller
|
||||
{
|
||||
private readonly IMetrologyRepo _Repo;
|
||||
private readonly bool _IsTestDatabase;
|
||||
private readonly IRdsMaxRepo _RdsMaxRepo;
|
||||
private readonly IMetrologyRepository _MetrologyRepo;
|
||||
|
||||
public PagesController(AppSettings appSettings, IMetrologyRepo repo)
|
||||
public PagesController(AppSettings appSettings, IMetrologyRepository metrologyRepository, IRdsMaxRepo rdsMaxRepo)
|
||||
{
|
||||
_Repo = repo;
|
||||
_RdsMaxRepo = rdsMaxRepo;
|
||||
_MetrologyRepo = metrologyRepository;
|
||||
_IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase);
|
||||
}
|
||||
|
||||
@ -31,10 +35,13 @@ public class PagesController : Controller
|
||||
|
||||
[HttpGet]
|
||||
[Route("/AwaitingDispo")]
|
||||
public IActionResult AwaitingDispo() => View();
|
||||
[Route("/Metrology/AwaitingDispo")]
|
||||
public IActionResult AwaitingDispo() =>
|
||||
View();
|
||||
|
||||
[HttpGet]
|
||||
[Route("/RunInfo")]
|
||||
[Route("/Metrology/RunInfo")]
|
||||
public IActionResult RunInfo([FromQuery] int tooltypeid = 1, [FromQuery] int headerid = 0)
|
||||
{
|
||||
RunInfo m = new()
|
||||
@ -45,16 +52,30 @@ public class PagesController : Controller
|
||||
};
|
||||
if (headerid > 0)
|
||||
{
|
||||
m.HeaderAttachmentID = _Repo.GetHeaderAttachmentID(tooltypeid, headerid);
|
||||
m.HeaderAttachmentID = _MetrologyRepo.GetHeaderAttachmentID(tooltypeid, headerid);
|
||||
}
|
||||
return View(m);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("/RunHeaders")]
|
||||
public IActionResult RunHeaders() => View();
|
||||
[Route("/Metrology/RunHeaders")]
|
||||
public IActionResult RunHeaders() =>
|
||||
View();
|
||||
|
||||
[HttpGet]
|
||||
[Route("/Crash")]
|
||||
public IActionResult Crash() => throw new Exception("Test unhandled exception");
|
||||
public IActionResult Crash() =>
|
||||
throw new Exception("Test unhandled exception");
|
||||
|
||||
[HttpGet]
|
||||
[Route("/RdsMax")]
|
||||
[Route("/Metrology/RdsMax")]
|
||||
public IActionResult RdsMax()
|
||||
{
|
||||
Shared.DataModels.RDS.Max[] collection = _RdsMaxRepo.GetMaxRDS();
|
||||
List<string[]> results = _RdsMaxRepo.Convert(collection);
|
||||
return View(results);
|
||||
}
|
||||
|
||||
}
|
@ -1,56 +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)
|
||||
{
|
||||
|
||||
protected string _ApiLoggingContentTypes;
|
||||
protected string _ApiLoggingPathPrefixes;
|
||||
protected string _ApiLogPath;
|
||||
protected string _AttachmentPath;
|
||||
protected string _BuildNumber;
|
||||
protected string _Company;
|
||||
protected string _ConnectionString;
|
||||
protected string _GitCommitSeven;
|
||||
protected string _InboundApiAllowedIPList;
|
||||
protected string _MonARessource;
|
||||
protected string _OIExportPath;
|
||||
protected string _URLs;
|
||||
protected string _WorkingDirectoryName;
|
||||
public string ApiLoggingContentTypes => _ApiLoggingContentTypes;
|
||||
public string ApiLoggingPathPrefixes => _ApiLoggingPathPrefixes;
|
||||
public string ApiLogPath => _ApiLogPath;
|
||||
public string AttachmentPath => _AttachmentPath;
|
||||
public string BuildNumber => _BuildNumber;
|
||||
public string Company => _Company;
|
||||
public string ConnectionString => _ConnectionString;
|
||||
public string GitCommitSeven => _GitCommitSeven;
|
||||
public string InboundApiAllowedIPList => _InboundApiAllowedIPList;
|
||||
public string MonARessource => _MonARessource;
|
||||
public string OIExportPath => _OIExportPath;
|
||||
public string URLs => _URLs;
|
||||
public string WorkingDirectoryName => _WorkingDirectoryName;
|
||||
|
||||
[JsonConstructor]
|
||||
public AppSettings(string apiLoggingContentTypes, string apiLoggingPathPrefixes, string apiLogPath, string attachmentPath, string buildNumber, string company, string connectionString, string gitCommitSeven, string inboundApiAllowedIPList, string monARessource, string oiExportPath, string urls, string workingDirectoryName)
|
||||
{
|
||||
_ApiLoggingContentTypes = apiLoggingContentTypes;
|
||||
_ApiLoggingPathPrefixes = apiLoggingPathPrefixes;
|
||||
_ApiLogPath = apiLogPath;
|
||||
_AttachmentPath = attachmentPath;
|
||||
_BuildNumber = buildNumber;
|
||||
_Company = company;
|
||||
_ConnectionString = connectionString;
|
||||
_GitCommitSeven = gitCommitSeven;
|
||||
_InboundApiAllowedIPList = inboundApiAllowedIPList;
|
||||
_MonARessource = monARessource;
|
||||
_OIExportPath = oiExportPath;
|
||||
_URLs = urls;
|
||||
_WorkingDirectoryName = workingDirectoryName;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
|
||||
|
2
Archive/Models/Binder/.editorconfig
Normal file
2
Archive/Models/Binder/.editorconfig
Normal file
@ -0,0 +1,2 @@
|
||||
[*.cs]
|
||||
csharp_preserve_single_line_statements = true
|
@ -1,4 +1,5 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using System;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace OI.Metrology.Archive.Models.Binder;
|
||||
@ -6,36 +7,21 @@ namespace OI.Metrology.Archive.Models.Binder;
|
||||
public class AppSettings
|
||||
{
|
||||
|
||||
[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 Ressource"), Required] public string MonARessource { 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; }
|
||||
|
||||
public AppSettings()
|
||||
{
|
||||
ApiLoggingContentTypes = string.Empty;
|
||||
ApiLoggingPathPrefixes = string.Empty;
|
||||
ApiLogPath = string.Empty;
|
||||
AttachmentPath = string.Empty;
|
||||
BuildNumber = string.Empty;
|
||||
Company = string.Empty;
|
||||
ConnectionString = string.Empty;
|
||||
GitCommitSeven = string.Empty;
|
||||
InboundApiAllowedIPList = string.Empty;
|
||||
MonARessource = string.Empty;
|
||||
OIExportPath = string.Empty;
|
||||
URLs = string.Empty;
|
||||
WorkingDirectoryName = string.Empty;
|
||||
}
|
||||
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()
|
||||
{
|
||||
@ -43,4 +29,70 @@ public class AppSettings
|
||||
return result;
|
||||
}
|
||||
|
||||
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,
|
||||
appSettings.ApiLogPath,
|
||||
appSettings.AttachmentPath,
|
||||
appSettings.BuildNumber,
|
||||
appSettings.Company,
|
||||
appSettings.ConnectionString,
|
||||
appSettings.GitCommitSeven,
|
||||
appSettings.InboundApiAllowedIPList,
|
||||
appSettings.MonAResource,
|
||||
appSettings.MonASite,
|
||||
appSettings.Oi2SqlConnectionString,
|
||||
appSettings.OIExportPath,
|
||||
appSettings.URLs,
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
30
Archive/Models/Binder/Max.cs
Normal file
30
Archive/Models/Binder/Max.cs
Normal file
@ -0,0 +1,30 @@
|
||||
namespace OI.Metrology.Archive.Models.Binder;
|
||||
|
||||
public class Max
|
||||
{
|
||||
|
||||
#pragma warning disable
|
||||
|
||||
public string reactor_type { get; set; }
|
||||
public int reactor { get; set; }
|
||||
public string ls_id { get; set; }
|
||||
public string zone { get; set; }
|
||||
public string load_lock_side { get; set; }
|
||||
public int rds_no { get; set; }
|
||||
public string ps_no { get; set; }
|
||||
public string recipe_name { get; set; }
|
||||
public int recipe_no { get; set; }
|
||||
public string spec_type { get; set; }
|
||||
public string spec_thick_mtool { get; set; }
|
||||
public string spec_thick_mrecipe { get; set; }
|
||||
public string spec_res_mtool { get; set; }
|
||||
public string spec_res_mrecipe { get; set; }
|
||||
public string spec_cres_mtool { get; set; }
|
||||
public string spec_cres_mrecipe { get; set; }
|
||||
public int ci_no { get; set; }
|
||||
public int? mv_no { get; set; }
|
||||
public string scan_tool { get; set; }
|
||||
public string spec_surfscan_recipe { get; set; }
|
||||
public int? spec_ss_samp_qty { get; set; }
|
||||
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace OI.Metrology.Archive.Models.Stateless;
|
||||
|
||||
public abstract class AppSettings
|
||||
{
|
||||
|
||||
#nullable enable
|
||||
|
||||
public static Models.AppSettings Get(IConfigurationRoot configurationRoot)
|
||||
{
|
||||
Models.AppSettings? result;
|
||||
Binder.AppSettings appSettings = configurationRoot.Get<Binder.AppSettings>();
|
||||
string json = JsonSerializer.Serialize(appSettings, new JsonSerializerOptions() { WriteIndented = true });
|
||||
result = JsonSerializer.Deserialize<Models.AppSettings>(json);
|
||||
if (result is null)
|
||||
throw new Exception(json);
|
||||
if (string.IsNullOrEmpty(result.Company))
|
||||
throw new Exception(json);
|
||||
string jsonThis = result.ToString();
|
||||
if (jsonThis != json)
|
||||
{
|
||||
int? check = null;
|
||||
int min = new int[] { json.Length, jsonThis.Length }.Min();
|
||||
for (int i = 0; i < min; i++)
|
||||
{
|
||||
if (json[i] == jsonThis[i])
|
||||
continue;
|
||||
check = i;
|
||||
break;
|
||||
}
|
||||
if (check is null)
|
||||
throw new Exception();
|
||||
string a = json[..check.Value].Split(',')[^1];
|
||||
string b = json[check.Value..].Split(',')[0];
|
||||
throw new Exception($"{a}{b}");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
@ -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\" />
|
||||
@ -57,4 +48,12 @@
|
||||
<ItemGroup>
|
||||
<None Include="compilerconfig.json" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="appsettings.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="appsettings.Development.json">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -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,27 @@ public class Program
|
||||
|
||||
public static int Main(string[] args)
|
||||
{
|
||||
LoggerConfiguration loggerConfiguration = new();
|
||||
(string assemblyName, WebApplicationOptions webApplicationOptions) = Get(args);
|
||||
WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(webApplicationOptions);
|
||||
ILogger<Program>? logger = null;
|
||||
(string assemblyName, WebApplicationOptions _) = Get(args);
|
||||
WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args);
|
||||
_ = webApplicationBuilder.Configuration.AddUserSecrets<Program>();
|
||||
AppSettings appSettings = Models.Stateless.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();
|
||||
_ = webApplicationBuilder.Services.AddSession(sessionOptions =>
|
||||
@ -82,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");
|
||||
@ -96,7 +96,7 @@ public class Program
|
||||
}
|
||||
else
|
||||
{
|
||||
if (string.IsNullOrEmpty(appSettings.URLs))
|
||||
if (string.IsNullOrEmpty(_AppSettings.URLs))
|
||||
{
|
||||
Environment.ExitCode = -1;
|
||||
webApplication.Lifetime.StopApplication();
|
||||
@ -104,26 +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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
@ -25,21 +28,8 @@ public class MetrologyRepo : IMetrologyRepo
|
||||
|
||||
private DbConnection GetDbConnection() => _DBConnectionFactory.GetDbConnection();
|
||||
|
||||
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;
|
||||
}
|
||||
protected DbProviderFactory GetDbProviderFactory(IDbConnection conn) =>
|
||||
DbProviderFactories.GetFactory(conn.GetType().Namespace);
|
||||
|
||||
public TransactionScope StartTransaction() => new();
|
||||
|
||||
@ -135,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");
|
||||
@ -152,7 +142,7 @@ public class MetrologyRepo : IMetrologyRepo
|
||||
}
|
||||
}
|
||||
|
||||
if (containerField == null)
|
||||
if (containerField is null)
|
||||
{
|
||||
// No container field, just insert a single row
|
||||
|
||||
@ -163,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;
|
||||
|
||||
@ -226,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>())
|
||||
@ -250,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);
|
||||
}
|
||||
@ -265,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);
|
||||
}
|
||||
@ -305,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 + "]");
|
||||
}
|
||||
@ -322,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();
|
||||
|
||||
@ -418,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();
|
||||
|
||||
@ -529,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();
|
||||
|
||||
@ -624,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 =
|
||||
@ -637,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 =
|
||||
@ -656,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);
|
||||
@ -683,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}] ";
|
||||
@ -717,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();
|
||||
|
||||
@ -750,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);
|
||||
@ -763,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)
|
||||
@ -792,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 =
|
||||
@ -804,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 =
|
||||
@ -814,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();
|
||||
}
|
296
Archive/Repositories/RdsMaxRepo.cs
Normal file
296
Archive/Repositories/RdsMaxRepo.cs
Normal file
@ -0,0 +1,296 @@
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using OI.Metrology.Shared.DataModels.RDS;
|
||||
using OI.Metrology.Shared.Repositories;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace OI.Metrology.Archive.Repositories;
|
||||
|
||||
#nullable disable
|
||||
|
||||
public class RdsMaxRepo : IRdsMaxRepo
|
||||
{
|
||||
|
||||
private readonly IMemoryCache _MemoryCache;
|
||||
private readonly Models.AppSettings _AppSettings;
|
||||
|
||||
public RdsMaxRepo(Models.AppSettings appSettings, IMemoryCache memoryCache)
|
||||
{
|
||||
_MemoryCache = memoryCache;
|
||||
_AppSettings = appSettings;
|
||||
}
|
||||
|
||||
public RdsMaxRepo(string json, IMemoryCache memoryCache)
|
||||
{
|
||||
_MemoryCache = memoryCache;
|
||||
Models.AppSettings appSettings = System.Text.Json.JsonSerializer.Deserialize<Models.AppSettings>(json);
|
||||
_AppSettings = appSettings;
|
||||
}
|
||||
|
||||
protected void CacheItem(string key, object v)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine("CacheItem: " + key);
|
||||
|
||||
_ = _MemoryCache.Set(key, v, new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(1)));
|
||||
}
|
||||
|
||||
private static string GetMaxRdsSql()
|
||||
{
|
||||
StringBuilder result = new();
|
||||
_ = result.Append(" select ").
|
||||
Append(" rt.reactor_type ").
|
||||
Append(" , rr.reactor ").
|
||||
Append(" , rt.ls_id ").
|
||||
Append(" , rt.zone ").
|
||||
Append(" , rr.load_lock_side ").
|
||||
Append(" , rr.rds_no ").
|
||||
Append(" , rr.wo_no ").
|
||||
Append(" , rr.ps_no ").
|
||||
Append(" , rr.recipe_name ").
|
||||
Append(" , rr.recipe_no ").
|
||||
Append(" , rr.spec_type ").
|
||||
Append(" , rt.spec_thick_mtool ").
|
||||
Append(" , rt.spec_thick_mrecipe ").
|
||||
Append(" , rt.spec_res_mtool ").
|
||||
Append(" , rt.spec_res_mrecipe ").
|
||||
Append(" , rt.spec_cres_mtool ").
|
||||
Append(" , rt.spec_cres_mrecipe ").
|
||||
Append(" , ci.ci_no ").
|
||||
Append(" , cr.mv_no ").
|
||||
Append(" , cr.scan_tool ").
|
||||
Append(" , cr.spec_surfscan_recipe ").
|
||||
Append(" , cr.spec_ss_samp_qty ").
|
||||
Append(" from ( ").
|
||||
Append(" select rds_no ").
|
||||
Append(" from lsl2sql.dbo.react_run qa ").
|
||||
Append(" inner join ( ").
|
||||
Append(" select max(qb.rds_no) max_rds_no, qb.reactor ").
|
||||
Append(" from lsl2sql.dbo.react_run qb ").
|
||||
Append(" where qb.load_sig != '' ").
|
||||
Append(" and qb.load_sig_dtm > @load_sig_dtm ").
|
||||
Append(" group by qb.reactor ").
|
||||
Append(" ) qb ").
|
||||
Append(" on qa.rds_no = qb.max_rds_no ").
|
||||
Append(" ) as qc ").
|
||||
Append(" inner join lsl2sql.dbo.react_run rr ").
|
||||
Append(" on qc.rds_no = rr.rds_no ").
|
||||
Append(" left join [lsl2sql].[dbo].[rds_test] rt ").
|
||||
Append(" on rr.rds_no = rt.rds_no ").
|
||||
Append(" and rr.ps_no = rt.ps_no ").
|
||||
Append(" left join [lsl2sql].[dbo].[clean_insp] ci ").
|
||||
Append(" on rr.rds_no = ci.rds_no ").
|
||||
Append(" and ci.stage = 'LWI' ").
|
||||
Append(" left join [lsl2sql].[dbo].[clean_insp_scan_results] cr ").
|
||||
Append(" on ci.ci_no = cr.ci_no ").
|
||||
Append(" order by ").
|
||||
Append(" rr.reactor ").
|
||||
Append(" , rt.ls_id ").
|
||||
Append(" , rt.zone ").
|
||||
Append(" for json path ");
|
||||
return result.ToString();
|
||||
}
|
||||
|
||||
private string GetMaxRDSJson(string commandText)
|
||||
{
|
||||
StringBuilder result = new();
|
||||
try
|
||||
{
|
||||
using DbConnection dbConnection = SqlClientFactory.Instance.CreateConnection();
|
||||
dbConnection.ConnectionString = _AppSettings.Oi2SqlConnectionString;
|
||||
dbConnection.Open();
|
||||
using DbCommand dbCommand = dbConnection.CreateCommand();
|
||||
dbCommand.CommandText = commandText;
|
||||
using DbDataReader reader = dbCommand.ExecuteReader(CommandBehavior.SequentialAccess);
|
||||
while (reader.Read())
|
||||
_ = result.Append(reader.GetString(0));
|
||||
dbConnection.Close();
|
||||
}
|
||||
catch (Exception)
|
||||
{ }
|
||||
return result.ToString();
|
||||
}
|
||||
|
||||
public Max[] GetMaxRDS()
|
||||
{
|
||||
Max[] cached;
|
||||
string cacheKey = "GetMaxRDS";
|
||||
if (_MemoryCache.TryGetValue(cacheKey, out cached))
|
||||
return cached;
|
||||
|
||||
string loadSigDTM = DateTime.Now.AddDays(-90).ToString("yyyy-MM-dd 00:00:00.000");
|
||||
string sql = GetMaxRdsSql();
|
||||
string commandText = sql.Replace("@load_sig_dtm", $"'{loadSigDTM}'");
|
||||
string json = GetMaxRDSJson(commandText);
|
||||
Max[] r = System.Text.Json.JsonSerializer.Deserialize<Max[]>(json);
|
||||
|
||||
CacheItem(cacheKey, r);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
private static Dictionary<int, List<Max>> GetReactorToRecords(Max[] collection)
|
||||
{
|
||||
Dictionary<int, List<Max>> results = new();
|
||||
foreach (Max max in collection)
|
||||
{
|
||||
if (!results.ContainsKey(max.Reactor))
|
||||
results.Add(max.Reactor, new());
|
||||
results[max.Reactor].Add(max);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
private static (string[], int[], int[], int[]) GetDistinct(Max[] collection)
|
||||
{
|
||||
List<string> layerCollection = new();
|
||||
List<int> comboCollection = new();
|
||||
List<int> zoneCollection = new();
|
||||
List<int> cleanCollection = new();
|
||||
foreach (Max max in collection)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(max.LsId) && max.LsId[0] == 'L' && !layerCollection.Contains(max.LsId))
|
||||
layerCollection.Add(max.LsId);
|
||||
if (!string.IsNullOrEmpty(max.LsId) && max.LsId[0] != 'L' && int.TryParse(max.LsId, out int comboCheck) && !comboCollection.Contains(comboCheck))
|
||||
comboCollection.Add(comboCheck);
|
||||
if (!string.IsNullOrEmpty(max.Zone) && int.TryParse(max.Zone, out int zoneCheck) && !zoneCollection.Contains(zoneCheck))
|
||||
zoneCollection.Add(zoneCheck);
|
||||
if (max.MvNo.HasValue && !cleanCollection.Contains(max.MvNo.Value))
|
||||
cleanCollection.Add(max.MvNo.Value);
|
||||
}
|
||||
return new(layerCollection.OrderBy(l => l).ToArray(), comboCollection.OrderBy(l => l).ToArray(), zoneCollection.OrderBy(l => l).ToArray(), cleanCollection.OrderBy(l => l).ToArray());
|
||||
}
|
||||
|
||||
private static Max[] GetLayerZoneCollection(Dictionary<string, List<(string, Max)>> layerZoneToCollection)
|
||||
{
|
||||
Max[] results;
|
||||
List<(string Sort, Max Max)> collection = new();
|
||||
foreach (KeyValuePair<string, List<(string, Max)>> keyValuePair in layerZoneToCollection)
|
||||
collection.AddRange(keyValuePair.Value);
|
||||
results = (from l in collection orderby l.Sort select l.Max).ToArray();
|
||||
return results;
|
||||
}
|
||||
|
||||
private static Max[] GetLayerZoneCollection(string[] layerCollection, int[] comboCollection, int[] zoneCollection, List<Max> collection)
|
||||
{
|
||||
Max[] results;
|
||||
string key;
|
||||
string sort;
|
||||
string distinct;
|
||||
List<string> distinctCollection = new();
|
||||
Dictionary<string, List<(string, Max)>> layerZoneToCollection = new();
|
||||
foreach (string layer in layerCollection)
|
||||
{
|
||||
layerZoneToCollection.Add(string.Concat(layer, '.'), new());
|
||||
foreach (int zone in zoneCollection)
|
||||
layerZoneToCollection.Add(string.Concat(layer, '.', zone), new());
|
||||
}
|
||||
foreach (int combo in comboCollection)
|
||||
{
|
||||
layerZoneToCollection.Add(string.Concat(combo, '.'), new());
|
||||
foreach (int zone in zoneCollection)
|
||||
layerZoneToCollection.Add(string.Concat(combo, '.', zone), new());
|
||||
}
|
||||
foreach (Max max in collection)
|
||||
{
|
||||
if (string.IsNullOrEmpty(max.LsId))
|
||||
continue;
|
||||
sort = string.Concat(max.LsId.PadLeft(2, 'Z'), '.', max.Zone);
|
||||
key = string.Concat(max.LsId, '.', max.Zone);
|
||||
distinct = string.Concat(max.LsId, '\t', max.Zone, '\t', max.LoadLockSide, '\t', max.RdsNo, '\t', max.PsNo, '\t', max.RecipeName, '\t', max.SpecType, '\t', max.SpecThickMtool, '\t', max.SpecThickMrecipe, '\t', max.SpecResMtool, '\t', max.SpecResMrecipe, '\t', max.SpecCresMtool, '\t', max.SpecCresMrecipe);
|
||||
if (distinctCollection.Contains(distinct))
|
||||
continue;
|
||||
distinctCollection.Add(distinct);
|
||||
layerZoneToCollection[key].Add(new(sort, max));
|
||||
}
|
||||
results = GetLayerZoneCollection(layerZoneToCollection);
|
||||
return results;
|
||||
}
|
||||
|
||||
private static Max[] GetCleanCollection(Dictionary<int, List<(int, Max)>> layerZoneToCollection)
|
||||
{
|
||||
Max[] results;
|
||||
List<(int Sort, Max Max)> collection = new();
|
||||
foreach (KeyValuePair<int, List<(int, Max)>> keyValuePair in layerZoneToCollection)
|
||||
collection.AddRange(keyValuePair.Value);
|
||||
results = (from l in collection orderby l.Sort select l.Max).ToArray();
|
||||
return results;
|
||||
}
|
||||
|
||||
private static Max[] GetCleanCollection(int[] cleanCollection, List<Max> collection)
|
||||
{
|
||||
Max[] results;
|
||||
int key;
|
||||
string distinct;
|
||||
List<string> distinctCollection = new();
|
||||
Dictionary<int, List<(int, Max)>> cleanToCollection = new();
|
||||
foreach (int clean in cleanCollection)
|
||||
cleanToCollection.Add(clean, new());
|
||||
foreach (Max max in collection)
|
||||
{
|
||||
if (max.MvNo is null)
|
||||
continue;
|
||||
key = max.MvNo.Value;
|
||||
distinct = string.Concat(max.MvNo, '\t', max.ScanTool, '\t', max.SpecSurfscanRecipe, '\t', max.SpecSsSampQty);
|
||||
if (distinctCollection.Contains(distinct))
|
||||
continue;
|
||||
distinctCollection.Add(distinct);
|
||||
cleanToCollection[key].Add(new(key, max));
|
||||
}
|
||||
results = GetCleanCollection(cleanToCollection);
|
||||
return results;
|
||||
}
|
||||
|
||||
public List<string[]> Convert(Max[] collection)
|
||||
{
|
||||
List<string[]> results = new();
|
||||
string[] row;
|
||||
Max[] cleanCollectionB;
|
||||
List<string> res = new();
|
||||
Max[] layerZoneCollection;
|
||||
List<string> clean = new();
|
||||
List<string> thick = new();
|
||||
List<string> centerRes = new();
|
||||
StringBuilder stringBuilder = new();
|
||||
_ = stringBuilder.Append($"Reactor\tReactorType\tWO\tRDS\tPSN\tName\tSpecType\tRes\tThick\tCenter Res\tScan");
|
||||
row = stringBuilder.ToString().Split('\t');
|
||||
results.Add(row);
|
||||
Dictionary<int, List<Max>> reactorToRecords = GetReactorToRecords(collection);
|
||||
(string[] layerCollection, int[] comboCollection, int[] zoneCollection, int[] cleanCollection) = GetDistinct(collection);
|
||||
foreach (KeyValuePair<int, List<Max>> reactorToRecord in reactorToRecords)
|
||||
{
|
||||
res.Clear();
|
||||
clean.Clear();
|
||||
thick.Clear();
|
||||
centerRes.Clear();
|
||||
_ = stringBuilder.Clear();
|
||||
foreach (Max max in reactorToRecord.Value)
|
||||
{
|
||||
_ = stringBuilder.Append($"R{max.Reactor}\t{max.ReactorType}\t{max.WoNo}\t{max.RdsNo}\t{max.PsNo}\t{max.RecipeName}\t{max.SpecType}\t");
|
||||
break;
|
||||
}
|
||||
layerZoneCollection = GetLayerZoneCollection(layerCollection, comboCollection, zoneCollection, reactorToRecord.Value);
|
||||
foreach (Max max in layerZoneCollection)
|
||||
{
|
||||
res.Add(string.Concat(max.LsId, '.', max.Zone, " - ", max.SpecResMtool, " {", max.SpecResMrecipe, '}'));
|
||||
thick.Add(string.Concat(max.LsId, '.', max.Zone, " - ", max.SpecThickMtool, " {", max.SpecThickMrecipe, '}'));
|
||||
centerRes.Add(string.Concat(max.LsId, '.', max.Zone, " - ", max.SpecCresMtool, " {", max.SpecCresMrecipe, '}'));
|
||||
}
|
||||
_ = stringBuilder.Append($"{string.Join("<br />", res.ToArray())}\t");
|
||||
_ = stringBuilder.Append($"{string.Join("<br />", thick.ToArray())}\t");
|
||||
_ = stringBuilder.Append($"{string.Join("<br />", centerRes.ToArray())}\t");
|
||||
cleanCollectionB = GetCleanCollection(cleanCollection, reactorToRecord.Value);
|
||||
foreach (Max max in cleanCollectionB)
|
||||
clean.Add(string.Concat(max.MvNo, " - {", max.SpecSurfscanRecipe, "} [", max.SpecSsSampQty, "] ", max.ScanTool));
|
||||
_ = stringBuilder.Append($"{string.Join("<br />", clean.ToArray())}");
|
||||
row = stringBuilder.ToString().Split('\t');
|
||||
results.Add(row);
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
}
|
@ -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,
|
||||
|
@ -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();
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
|
43
Archive/Views/Pages/RdsMax.cshtml
Normal file
43
Archive/Views/Pages/RdsMax.cshtml
Normal file
@ -0,0 +1,43 @@
|
||||
@model System.Collections.Generic.List<string[]>
|
||||
@{
|
||||
ViewData["Title"] = "Max RDS per Reactor with Recipes";
|
||||
}
|
||||
|
||||
<style>
|
||||
html,
|
||||
body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
div.container-fluid {
|
||||
height: 90%;
|
||||
}
|
||||
|
||||
#HeaderGrid,
|
||||
#FieldsGrid {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.FieldTitle {
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
|
||||
<h4>Max RDS per Reactor with Recipes</h4>
|
||||
|
||||
<table border="1" style="width:100%">
|
||||
@foreach (string[] row in Model)
|
||||
{
|
||||
<tr>
|
||||
@foreach (string column in row)
|
||||
{
|
||||
<td>@Html.Raw(column)</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
});
|
||||
</script>
|
@ -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>
|
||||
|
@ -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": {
|
||||
@ -17,6 +17,9 @@
|
||||
}
|
||||
},
|
||||
"InboundApiAllowedIPList": "",
|
||||
"MonAResource": "OI_Metrology_Archive_IFX",
|
||||
"MonASite": "auc",
|
||||
"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": [
|
||||
|
@ -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": {
|
||||
@ -17,6 +17,9 @@
|
||||
}
|
||||
},
|
||||
"InboundApiAllowedIPList": "",
|
||||
"MonAResource": "OI_Metrology_Archive_EC",
|
||||
"MonASite": "auc",
|
||||
"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
266
Jenkinsfile
vendored
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
|
10
README.md
10
README.md
@ -23,3 +23,13 @@ Ouellette Jonathan (IFAM IT FI MES) created #315807, 7/25/2022
|
||||
|
||||
## Git
|
||||
* git@tfs.intra.infineon.com:22/tfs/ManufacturingIT/Mesa_FI/_git/APC-Viewer
|
||||
|
||||
## TFS / Azure DevOps - Pipelines
|
||||
* https://tfs.intra.infineon.com/tfs/manufacturingit/Mesa_FI/_build?definitionId=5439&_a=summary
|
||||
* https://tfs.intra.infineon.com/tfs/manufacturingit/Mesa_FI/_release?_a=releases&view=mine&definitionId=1
|
||||
|
||||
4c07c49f3b9daa69fecd9d5be64e047d0ad6be1d
|
||||
343ff2d792149c9eef1216f44dbdb73935cf6041
|
||||
|
||||
https://oi-metrology-viewer-prod.mes.infineon.com/
|
||||
https://oi-metrology-viewer-archive.mes.infineon.com/
|
1
Server/.vscode/format-report.json
vendored
Normal file
1
Server/.vscode/format-report.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
[]
|
@ -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
5
Server/.vscode/settings.json
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"cSpell.words": [
|
||||
"Infineon"
|
||||
]
|
||||
}
|
174
Server/.vscode/tasks.json
vendored
Normal file
174
Server/.vscode/tasks.json
vendored
Normal 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": []
|
||||
}
|
||||
]
|
||||
}
|
23
Server/ApiControllers/AppSettingsController.cs
Normal file
23
Server/ApiControllers/AppSettingsController.cs
Normal 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());
|
||||
|
||||
}
|
@ -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); }
|
||||
}
|
||||
|
||||
}
|
47
Server/ApiControllers/AwaitingDispoController.cs
Normal file
47
Server/ApiControllers/AwaitingDispoController.cs
Normal 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());
|
||||
|
||||
}
|
29
Server/ApiControllers/ClientSettingsController.cs
Normal file
29
Server/ApiControllers/ClientSettingsController.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
104
Server/ApiControllers/ExportController.cs
Normal file
104
Server/ApiControllers/ExportController.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
36
Server/ApiControllers/FileShareController.cs
Normal file
36
Server/ApiControllers/FileShareController.cs
Normal 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();
|
||||
}
|
||||
|
||||
}
|
70
Server/ApiControllers/InboundController.cs
Normal file
70
Server/ApiControllers/InboundController.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
52
Server/ApiControllers/InfinityQSController.cs
Normal file
52
Server/ApiControllers/InfinityQSController.cs
Normal 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 });
|
||||
}
|
||||
|
||||
}
|
52
Server/ApiControllers/InfinityQSV2Controller.cs
Normal file
52
Server/ApiControllers/InfinityQSV2Controller.cs
Normal 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 });
|
||||
}
|
||||
|
||||
}
|
70
Server/ApiControllers/InfinityQSV3Controller.cs
Normal file
70
Server/ApiControllers/InfinityQSV3Controller.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
86
Server/ApiControllers/InfinityQSV4Controller.cs
Normal file
86
Server/ApiControllers/InfinityQSV4Controller.cs
Normal 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));
|
||||
|
||||
}
|
24
Server/ApiControllers/OpenInsightV1Controller.cs
Normal file
24
Server/ApiControllers/OpenInsightV1Controller.cs
Normal 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);
|
||||
}
|
||||
|
||||
}
|
33
Server/ApiControllers/PinController.cs
Normal file
33
Server/ApiControllers/PinController.cs
Normal 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 });
|
||||
|
||||
}
|
46
Server/ApiControllers/ServiceShopOrderController.cs
Normal file
46
Server/ApiControllers/ServiceShopOrderController.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
93
Server/ApiControllers/ToolTypesController.cs
Normal file
93
Server/ApiControllers/ToolTypesController.cs
Normal 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 }));
|
||||
}
|
||||
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
8035
Server/Data/Mike/service-shop.json
Normal file
8035
Server/Data/Mike/service-shop.json
Normal file
File diff suppressed because it is too large
Load Diff
1
Server/Data/Tests/AppSettings-GetAppSettings.json
Normal file
1
Server/Data/Tests/AppSettings-GetAppSettings.json
Normal 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}
|
@ -0,0 +1 @@
|
||||
1000014-6bc0487
|
1
Server/Data/Tests/ClientSettings-GetClientSettings.json
Normal file
1
Server/Data/Tests/ClientSettings-GetClientSettings.json
Normal file
@ -0,0 +1 @@
|
||||
["remoteIpAddress"]
|
0
Server/Data/Tests/Export-GetExport.txt
Normal file
0
Server/Data/Tests/Export-GetExport.txt
Normal file
4
Server/Data/Tests/Export-GetHeaders.json
Normal file
4
Server/Data/Tests/Export-GetHeaders.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"Results": [],
|
||||
"TotalRows": 0
|
||||
}
|
90
Server/Data/Tests/Export-GetLogistics.json
Normal file
90
Server/Data/Tests/Export-GetLogistics.json
Normal 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
|
||||
}
|
@ -0,0 +1 @@
|
||||
asdf
|
35
Server/Data/Tests/InfinityQS-GetCommandText.sql
Normal file
35
Server/Data/Tests/InfinityQS-GetCommandText.sql
Normal 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
|
905
Server/Data/Tests/InfinityQS-GetData.json
Normal file
905
Server/Data/Tests/InfinityQS-GetData.json
Normal 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
|
||||
}
|
236
Server/Data/Tests/InfinityQS-GetDescriptors.json
Normal file
236
Server/Data/Tests/InfinityQS-GetDescriptors.json
Normal 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
|
||||
}
|
4
Server/Data/Tests/InfinityQS-GetEvents.json
Normal file
4
Server/Data/Tests/InfinityQS-GetEvents.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"Results": [],
|
||||
"TotalRows": 0
|
||||
}
|
20
Server/Data/Tests/InfinityQS-GetHeader.json
Normal file
20
Server/Data/Tests/InfinityQS-GetHeader.json
Normal 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
|
||||
}
|
50
Server/Data/Tests/InfinityQSV2-GetCommandText.sql
Normal file
50
Server/Data/Tests/InfinityQSV2-GetCommandText.sql
Normal 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
|
905
Server/Data/Tests/InfinityQSV2-GetData.json
Normal file
905
Server/Data/Tests/InfinityQSV2-GetData.json
Normal 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
|
||||
}
|
236
Server/Data/Tests/InfinityQSV2-GetDescriptors.json
Normal file
236
Server/Data/Tests/InfinityQSV2-GetDescriptors.json
Normal 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
|
||||
}
|
4
Server/Data/Tests/InfinityQSV2-GetEvents.json
Normal file
4
Server/Data/Tests/InfinityQSV2-GetEvents.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"Results": [],
|
||||
"TotalRows": 0
|
||||
}
|
20
Server/Data/Tests/InfinityQSV2-GetHeader.json
Normal file
20
Server/Data/Tests/InfinityQSV2-GetHeader.json
Normal 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
|
||||
}
|
78
Server/Data/Tests/InfinityQSV3-GetCommandText.sql
Normal file
78
Server/Data/Tests/InfinityQSV3-GetCommandText.sql
Normal 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
|
1023
Server/Data/Tests/InfinityQSV3-GetData.json
Normal file
1023
Server/Data/Tests/InfinityQSV3-GetData.json
Normal file
File diff suppressed because it is too large
Load Diff
152
Server/Data/Tests/InfinityQSV3-GetDescriptors.json
Normal file
152
Server/Data/Tests/InfinityQSV3-GetDescriptors.json
Normal 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
|
||||
}
|
@ -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>
|
@ -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;"
|
||||
]
|
||||
]
|
25
Server/Data/Tests/InfinityQSV3-GetHeader.json
Normal file
25
Server/Data/Tests/InfinityQSV3-GetHeader.json
Normal 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
|
||||
}
|
@ -0,0 +1 @@
|
||||
[{"ProcessMean":1.750000000000000e+001,"ProcessSigma":5.800000000000000e+000}]
|
1
Server/Data/Tests/OpenInsightV1-GetTencorRun.json
Normal file
1
Server/Data/Tests/OpenInsightV1-GetTencorRun.json
Normal 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"}]
|
4
Server/Data/Tests/Pin-GetPinnedTable.json
Normal file
4
Server/Data/Tests/Pin-GetPinnedTable.json
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"Results": [],
|
||||
"TotalRows": 0
|
||||
}
|
33
Server/Data/Tests/Reactors-GetReactors.json
Normal file
33
Server/Data/Tests/Reactors-GetReactors.json
Normal 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
1
Server/Data/Tests/ToolTypes-GetData.json
Normal file
1
Server/Data/Tests/ToolTypes-GetData.json
Normal 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}
|
93
Server/Data/Tests/ToolTypes-GetHeaderFields.json
Normal file
93
Server/Data/Tests/ToolTypes-GetHeaderFields.json
Normal 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
|
||||
}
|
167982
Server/Data/Tests/ToolTypes-GetHeaderTitles.json
Normal file
167982
Server/Data/Tests/ToolTypes-GetHeaderTitles.json
Normal file
File diff suppressed because it is too large
Load Diff
1
Server/Data/Tests/ToolTypes-GetHeaders.json
Normal file
1
Server/Data/Tests/ToolTypes-GetHeaders.json
Normal file
File diff suppressed because one or more lines are too long
344
Server/Data/Tests/ToolTypes-GetToolTypeMetadata.json
Normal file
344
Server/Data/Tests/ToolTypes-GetToolTypeMetadata.json
Normal 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
|
||||
}
|
33
Server/Data/Tests/ToolTypes-Index.json
Normal file
33
Server/Data/Tests/ToolTypes-Index.json
Normal 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
|
||||
}
|
43
Server/Models/AppSettings.cs
Normal file
43
Server/Models/AppSettings.cs
Normal 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;
|
||||
}
|
||||
|
||||
}
|
2
Server/Models/Binder/.editorconfig
Normal file
2
Server/Models/Binder/.editorconfig
Normal file
@ -0,0 +1,2 @@
|
||||
[*.cs]
|
||||
csharp_preserve_single_line_statements = true
|
148
Server/Models/Binder/AppSettings.cs
Normal file
148
Server/Models/Binder/AppSettings.cs
Normal 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
|
||||
{
|
||||
}
|
151
Server/OI.Metrology.Server.csproj
Normal file
151
Server/OI.Metrology.Server.csproj
Normal 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.10" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.1" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.8.1" />
|
||||
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
|
||||
<PackageReference Include="System.Drawing.Common" Version="8.0.10" />
|
||||
</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>
|
@ -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();
|
||||
(string assemblyName, WebApplicationOptions webApplicationOptions) = Get(args);
|
||||
WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(webApplicationOptions);
|
||||
ILogger<Program>? logger = null;
|
||||
(string assemblyName, WebApplicationOptions _) = Get(args);
|
||||
WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args);
|
||||
_ = webApplicationBuilder.Configuration.AddUserSecrets<Program>();
|
||||
AppSettings appSettings = Models.Stateless.AppSettings.Get(webApplicationBuilder.Configuration);
|
||||
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,28 +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;
|
||||
}
|
||||
}
|
||||
|
31
Server/Properties/launchSettings.json
Normal file
31
Server/Properties/launchSettings.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
52
Server/Repositories/AppSettingsRepository.cs
Normal file
52
Server/Repositories/AppSettingsRepository.cs
Normal 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();
|
||||
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user