Compare commits

..

12 Commits

Author SHA1 Message Date
4c2bef71ec Characterization Data
FI Backlog with Ignore Tag
2024-09-19 10:13:10 -07:00
b824c4ba36 Get text from OI 2024-08-28 15:58:20 -07:00
1ad6246b8d Bug fix for export 2024-07-30 11:36:27 -07:00
478aecf2c8 Link to OI Wizard and new files page 2024-07-17 10:58:48 -07:00
fe3292133e Expose error message using ProducesResponseType 2024-06-18 13:36:30 -07:00
e7b721fdb3 awaiting-disposition-header-attachment-id 2024-06-18 10:55:12 -07:00
da3e839a48 Host from Windows 2024-06-17 17:11:36 -07:00
6737ddfb59 Static Site 2024-06-14 16:51:30 -07:00
3aed250488 Bug fix: Missing Singleton 2024-05-25 10:27:10 -07:00
f53ae8c1c8 Bug fix: Attachment 2024-05-23 17:08:44 -07:00
6317c385f6 Separated Wafer-Counter
JsonElement instead of Request body
Attachment Class
Bump
Ready to test GetLastGroupIdWithValue
Changed to v4
2024-05-21 12:40:20 -07:00
5c9f0d1aff Remove with Text
Remove GetEngineeringSpcReview
Better error message
EnforceCodeStyleInBuild
NginxFileSystem
Remove Reactors and Working Directory
AppSettings
Delete self contained Thunder Tests
Back to .net8.0
api/v4/InfinityQS
ApiExplorerSettings
Wafer Counter
2024-04-15 13:13:55 -07:00
1804 changed files with 5026 additions and 1851 deletions

2
.gitignore vendored
View File

@ -344,3 +344,5 @@ ASALocalRun/
.kanbn .kanbn
Tests/.kanbn Tests/.kanbn
/Wafer-Counter/.vscode/.UserSecrets/secrets.json

6
.vscode/tasks.json vendored
View File

@ -217,12 +217,6 @@
"endsPattern": "^.*Application started.*" "endsPattern": "^.*Application started.*"
} }
} }
},
{
"label": "File-Folder-Helper AOT s M Self .Kanbn Tasks",
"type": "shell",
"command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s M '.kanbn/tasks'",
"problemMatcher": []
} }
] ]
} }

View File

@ -13,6 +13,44 @@
], ],
"problemMatcher": "$msCompile" "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", "label": "Format",
"command": "dotnet", "command": "dotnet",
@ -28,6 +66,16 @@
], ],
"problemMatcher": "$msCompile" "problemMatcher": "$msCompile"
}, },
{
"label": "Format-Whitespace",
"command": "dotnet",
"type": "process",
"args": [
"format",
"whitespace"
],
"problemMatcher": "$msCompile"
},
{ {
"label": "publish", "label": "publish",
"command": "dotnet", "command": "dotnet",
@ -36,7 +84,32 @@
"publish", "publish",
"${workspaceFolder}/OI.Metrology.Server.csproj", "${workspaceFolder}/OI.Metrology.Server.csproj",
"/property:GenerateFullPaths=true", "/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary" "/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" "problemMatcher": "$msCompile"
}, },
@ -87,9 +160,14 @@
} }
}, },
{ {
"label": "File-Folder-Helper AOT s V Repositories", "label": "File-Folder-Helper AOT s X Server",
"type": "shell", "type": "shell",
"command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s V Repositories", "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": [] "problemMatcher": []
} }
] ]

View File

@ -38,4 +38,10 @@ public class AwaitingDispoController : Controller, IAwaitingDispoController<IAct
else else
return StatusCode(444); return StatusCode(444);
} }
// this endpoint is used to clear the ReviewDate column, causing the header to show up again
[HttpGet("/api/awaitingdispo/{toolTypeId}/header-attachment-id")]
public IActionResult GetHeaderAttachmentID(int toolTypeId, [FromQuery] long headerid) =>
Content(_MetrologyRepository.GetHeaderAttachmentID(toolTypeId, headerid).ToString());
} }

View File

@ -4,6 +4,7 @@ namespace OI.Metrology.Server.ApiControllers;
using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
using System.Data;
using System.Text.Json; using System.Text.Json;
[Route("api/[controller]")] [Route("api/[controller]")]
@ -11,9 +12,13 @@ public class ExportController : Controller, IExportController<IActionResult>
{ {
private readonly IExportRepository _ExportRepository; private readonly IExportRepository _ExportRepository;
private readonly IMetrologyRepository _MetrologyRepository;
public ExportController(IExportRepository exportRepository) => public ExportController(IExportRepository exportRepository, IMetrologyRepository metrologyRepository)
{
_ExportRepository = exportRepository; _ExportRepository = exportRepository;
_MetrologyRepository = metrologyRepository;
}
private static string? GetJson(Stream stream) private static string? GetJson(Stream stream)
{ {
@ -79,4 +84,21 @@ public class ExportController : Controller, IExportController<IActionResult>
public IActionResult PostProcessDataStandardFormat() => public IActionResult PostProcessDataStandardFormat() =>
Content(_ExportRepository.GetProcessDataStandardFormat(GetHeaderCommon(Request.Body))); Content(_ExportRepository.GetProcessDataStandardFormat(GetHeaderCommon(Request.Body)));
[HttpGet]
[Route("{toolTypeId}/export")]
public IActionResult GetExportData(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend)
{
Result<DataTable> r = _ExportRepository.GetExportData(_MetrologyRepository, toolTypeId, datebegin, dateend);
string json = Newtonsoft.Json.JsonConvert.SerializeObject(r);
return Content(json);
}
[HttpGet]
[Route("{toolTypeId}/csv")]
public IActionResult GetCSVExport(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] string? filename)
{
string r = _ExportRepository.GetCSVExport(_MetrologyRepository, toolTypeId, datebegin, dateend);
return Content(r);
}
} }

View File

@ -22,7 +22,7 @@ public class FileShareController : Controller, IFileShareController<IResult>
[HttpGet("move-file")] [HttpGet("move-file")]
public IResult MoveFile(string from, string to) public IResult MoveFile(string from, string to)
{ {
_FileShareRepository.CopyFile(from, to); _FileShareRepository.MoveFile(from, to);
return Results.Ok(); return Results.Ok();
} }

View File

@ -4,6 +4,7 @@ using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services; using OI.Metrology.Shared.Services;
using System.Net; using System.Net;
using System.Text.Json;
namespace OI.Metrology.Server.ApiControllers; namespace OI.Metrology.Server.ApiControllers;
@ -29,22 +30,9 @@ public partial class InboundController : ControllerBase, IInboundController<IAct
_MetrologyRepository = metrologyRepository; _MetrologyRepository = metrologyRepository;
} }
private static string? GetJson(Stream stream)
{
string? result;
if (!stream.CanRead)
result = null;
else
{
Task<string> task = new StreamReader(stream).ReadToEndAsync();
result = task.Result;
}
return result;
}
[HttpPost] [HttpPost]
[Route("{tooltype}")] [Route("{tooltype}")]
public IActionResult Post(string tooltype) public IActionResult Post(string tooltype, JsonElement? jsonElement)
{ {
IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress;
if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP))
@ -54,8 +42,7 @@ public partial class InboundController : ControllerBase, IInboundController<IAct
} }
else else
{ {
string? json = GetJson(Request.Body); DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, jsonElement);
DataResponse dataResponse = _InboundRepository.Data(_MetrologyRepository, _InboundDataService, tooltype, json);
if (dataResponse.Errors.Count == 0) if (dataResponse.Errors.Count == 0)
return Ok(dataResponse); return Ok(dataResponse);
else else
@ -65,7 +52,7 @@ public partial class InboundController : ControllerBase, IInboundController<IAct
[HttpPost] [HttpPost]
[Route("{tooltype}/attachment")] [Route("{tooltype}/attachment")]
public IActionResult AttachFile(string tooltype, [FromQuery] long headerid, [FromQuery] string datauniqueid = "") public IActionResult AttachFile(string tooltype, Attachment? attachment)
{ {
IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress; IPAddress? remoteIP = HttpContext.Connection.RemoteIpAddress;
if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP)) if (!_InboundRepository.IsIPAddressAllowed(_AppSettings.InboundApiAllowedIPList, remoteIP))
@ -75,16 +62,8 @@ public partial class InboundController : ControllerBase, IInboundController<IAct
} }
else else
{ {
if (Request.Form is null) _InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, attachment);
return BadRequest($"Invalid form"); return Ok();
if (Request.Form.Files.Count != 1)
return BadRequest($"Invalid file count");
IFormFile formFile = Request.Form.Files[0];
string? message = _InboundRepository.AttachFile(_MetrologyRepository, _AttachmentsService, tooltype, headerid, datauniqueid, formFile.FileName, formFile);
if (message is null)
return Ok();
else
return BadRequest(message);
} }
} }

View File

@ -79,12 +79,8 @@ public class InfinityQSV4Controller : Controller, IInfinityQSV4Controller<IActio
public IActionResult GetProductionSpecification(string part) => public IActionResult GetProductionSpecification(string part) =>
Content(_InfinityQSRepositoryV4.GetProductionSpecification(part)); Content(_InfinityQSRepositoryV4.GetProductionSpecification(part));
[HttpGet("engineering-spc-review")] [HttpGet("{process}/last-group-id-with-value")]
public IActionResult GetEngineeringSpcReview() public IActionResult GetLastGroupIdWithValue(string process, string? part, int? test) =>
{ Content(_InfinityQSRepositoryV4.GetLastGroupIdWithValue(process, part, test));
Dictionary<string, List<string>> results = _InfinityQSRepositoryV4.GetEngineeringSpcReview();
string json = JsonSerializer.Serialize(results);
return Content(json, "application/json", System.Text.Encoding.UTF8);
}
} }

View File

@ -66,23 +66,6 @@ public class ToolTypesController : Controller, IToolTypesController<IActionResul
return Content(json); return Content(json);
} }
[HttpGet]
[Route("{toolTypeId}/export")]
public IActionResult GetExportData(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend)
{
Shared.DataModels.Result<DataTable> r = _ToolTypesRepository.GetExportData(_MetrologyRepo, toolTypeId, datebegin, dateend);
string json = JsonConvert.SerializeObject(r);
return Content(json);
}
[HttpGet]
[Route("{toolTypeId}/csv")]
public IActionResult GetCSVExport(int toolTypeId, [FromQuery] string? datebegin, [FromQuery] string? dateend, [FromQuery] string? filename)
{
byte[] r = _ToolTypesRepository.GetCSVExport(_MetrologyRepo, toolTypeId, datebegin, dateend);
return File(r, "application/octet-stream", filename);
}
[HttpGet] [HttpGet]
[Route("{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")] [Route("{toolTypeId}/{tabletype}/files/{attachmentId}/{filename}")]
public IActionResult GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename) public IActionResult GetAttachment(int toolTypeId, string tabletype, string attachmentId, string filename)

View File

@ -1,22 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.Models.Stateless;
namespace OI.Metrology.Server.ApiControllers;
[Route("api/v1/WaferCounter")]
public class WaferCounterController : Controller, IWaferCounterController<IActionResult>
{
private readonly IWaferCounterRepository _WaferCounterRepository;
public WaferCounterController(IWaferCounterRepository waferCounterRepository) =>
_WaferCounterRepository = waferCounterRepository;
[HttpGet("{waferSize}/last-quantity-and-slot-map")]
public IActionResult GetLastQuantityAndSlotMap(string area, string waferSize) =>
Json(_WaferCounterRepository.GetLastQuantityAndSlotMap(area, waferSize));
[HttpGet("{waferSize}/last-quantity-and-slot-map-with-text")]
public IActionResult GetLastQuantityAndSlotMapWithText(string area, string waferSize, string text) =>
Json(_WaferCounterRepository.GetLastQuantityAndSlotMapWithText(area, waferSize, text));
}

View File

@ -1,160 +0,0 @@
using Infineon.Monitoring.MonA;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.ViewModels;
using System.Text;
namespace OI.Metrology.Server.Controllers;
public class ExportController : Controller
{
private readonly ILogger _Logger;
private readonly AppSettings _AppSettings;
private readonly bool _IsTestDatabase;
private readonly IMetrologyRepository _MetrologyRepository;
public ExportController(AppSettings appSettings, ILogger<ExportController> logger, IMetrologyRepository metrologyRepository)
{
_Logger = logger;
_AppSettings = appSettings;
_MetrologyRepository = metrologyRepository;
_IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase);
}
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
ViewBag.IsTestDatabase = _IsTestDatabase;
}
private string GetApiUrl() => string.IsNullOrEmpty(_AppSettings.ApiUrl) ? Url.Content("~/") : _AppSettings.ApiUrl[0] == '~' ? Url.Content(_AppSettings.ApiUrl) : _AppSettings.ApiUrl;
[HttpGet]
[Route("/Export")]
public ActionResult Index()
{
Export model = new()
{
StartTime = DateTime.Now.AddMonths(-1),
EndTime = DateTime.Now
};
MonIn monIn = MonIn.GetInstance();
_ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Up);
ViewBag.ApiUrl = GetApiUrl();
return View(model);
}
[HttpPost]
[Route("/ExportData")]
public ActionResult ExportData(Export model)
{
ToolType? toolType = null;
if (string.IsNullOrEmpty(model.ToolType))
ModelState.AddModelError("Exception", "Invalid selection");
else
{
if (model.StartTime > model.EndTime)
ModelState.AddModelError("EndTime", "End time must be after start time");
IEnumerable<ToolType> toolTypes = _MetrologyRepository.GetToolTypes();
toolType = toolTypes.Where(tt => tt.ID.ToString() == model.ToolType).SingleOrDefault();
if (toolType is null)
ModelState.AddModelError("ToolType", "Invalid selection");
else if (string.IsNullOrWhiteSpace(toolType.ExportSPName))
ModelState.AddModelError("ToolType", "Tool type is not exportable");
}
if (ModelState.IsValid)
{
try
{
DateTime startDT = model.StartDate.Date.Add(model.StartTime.TimeOfDay);
DateTime endDT = model.EndDate.Date.Add(model.EndTime.TimeOfDay);
return DoCSVExport(toolType?.ToolTypeName, toolType?.ExportSPName, startDT, endDT);
}
catch (Exception ex)
{
ModelState.AddModelError("Exception", "Error exporting data");
ModelState.AddModelError("Exception", ex.Message);
string errorMessage = $"Error exporting: {ex}";
_Logger.LogError(message: errorMessage);
MonIn monIn = MonIn.GetInstance();
_ = monIn.SendStatus(_AppSettings.MonASite, _AppSettings.MonAResource, "Heartbeat", State.Warning);
}
}
ViewBag.ApiUrl = GetApiUrl();
return View("Index", model);
}
protected ActionResult DoCSVExport(string? toolTypeName, string? spName, DateTime startTime, DateTime endTime)
{
string fileName = string.Format("Export_{0}_{1:yyyyMMddHHmm}_to_{2:yyyyMMddHHmm}.csv", toolTypeName, startTime, endTime);
StringBuilder sb = new();
if (spName is null)
throw new NullReferenceException(nameof(spName));
System.Data.DataTable dt = _MetrologyRepository.ExportData(spName, startTime, endTime);
_ = sb.AppendLine(GetColumnHeaders(dt));
foreach (System.Data.DataRow dr in dt.Rows)
_ = sb.AppendLine(GetRowData(dr));
byte[] contents = Encoding.UTF8.GetBytes(sb.ToString());
return File(contents, "application/octet-stream", fileName);
}
protected static string GetRowData(System.Data.DataRow dr)
{
StringBuilder r = new();
for (int i = 0; i < dr.Table.Columns.Count; i++)
{
if (i > 0)
_ = r.Append(',');
object v = dr[i];
if (!Convert.IsDBNull(v))
{
string? c = Convert.ToString(v);
if (c is not null)
_ = r.Append(FormatForCSV(c));
}
}
return r.ToString();
}
protected static string GetColumnHeaders(System.Data.DataTable dt)
{
StringBuilder r = new();
for (int i = 0; i < dt.Columns.Count; i++)
{
if (i > 0)
_ = r.Append(',');
_ = r.Append(FormatForCSV(dt.Columns[i].ColumnName.TrimEnd('_')));
}
return r.ToString();
}
protected static string FormatForCSV(string v)
{
bool doubleQuoted = false;
StringBuilder r = new(v.Length + 2);
if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"'))
{
_ = r.Append('"');
doubleQuoted = true;
}
foreach (char c in v)
{
_ = c switch
{
'\r' or '\n' => r.Append(' '),
'"' => r.Append("\"\""),
_ => r.Append(c),
};
}
if (doubleQuoted)
_ = r.Append('"');
return r.ToString();
}
}

View File

@ -1,79 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.ViewModels;
namespace OI.Metrology.Server.Controllers;
public class PagesController : Controller
{
private readonly bool _IsTestDatabase;
private readonly AppSettings _AppSettings;
private readonly IMetrologyRepository _MetrologyRepository;
public PagesController(AppSettings appSettings, IMetrologyRepository metrologyRepository)
{
_AppSettings = appSettings;
_MetrologyRepository = metrologyRepository;
_IsTestDatabase = appSettings.ConnectionString.Contains("test", StringComparison.InvariantCultureIgnoreCase);
}
public override void OnActionExecuted(ActionExecutedContext context)
{
base.OnActionExecuted(context);
ViewBag.IsTestDatabase = _IsTestDatabase;
}
private string GetApiUrl() => string.IsNullOrEmpty(_AppSettings.ApiUrl) ? Url.Content("~/") : _AppSettings.ApiUrl[0] == '~' ? Url.Content(_AppSettings.ApiUrl) : _AppSettings.ApiUrl;
[HttpGet]
[Route("/")]
public IActionResult Index()
{
ViewBag.ApiUrl = GetApiUrl();
return View("AwaitingDispo");
}
[HttpGet]
[Route("/AwaitingDispo")]
[Route("/Metrology/AwaitingDispo")]
public IActionResult AwaitingDispo()
{
ViewBag.ApiUrl = GetApiUrl();
return View();
}
[HttpGet]
[Route("/RunInfo")]
[Route("/Metrology/RunInfo")]
public IActionResult RunInfo([FromQuery] int tooltypeid = 1, [FromQuery] int headerid = 0)
{
RunInfo m = new()
{
ToolTypeID = tooltypeid,
HeaderID = headerid,
HeaderAttachmentID = Guid.Empty,
};
if (headerid > 0)
{
m.HeaderAttachmentID = _MetrologyRepository.GetHeaderAttachmentID(tooltypeid, headerid);
}
ViewBag.ApiUrl = GetApiUrl();
return View(m);
}
[HttpGet]
[Route("/RunHeaders")]
[Route("/Metrology/RunHeaders")]
public IActionResult RunHeaders()
{
ViewBag.ApiUrl = GetApiUrl();
return View();
}
[HttpGet]
[Route("/Crash")]
public IActionResult Crash() => throw new Exception("Test unhandled exception");
}

View File

@ -13,6 +13,7 @@ public record AppSettings(string ApiFileShare,
string EcCharacterizationSi, string EcCharacterizationSi,
string EcMesaFileShareCharacterizationSi, string EcMesaFileShareCharacterizationSi,
string EcMesaFileShareMetrologySi, string EcMesaFileShareMetrologySi,
string EcMetrologySi,
string GitCommitSeven, string GitCommitSeven,
string InboundApiAllowedIPList, string InboundApiAllowedIPList,
string IqsColumns, string IqsColumns,

View File

@ -17,6 +17,7 @@ public class AppSettings
public string? EcCharacterizationSi { get; set; } public string? EcCharacterizationSi { get; set; }
public string? EcMesaFileShareCharacterizationSi { get; set; } public string? EcMesaFileShareCharacterizationSi { get; set; }
public string? EcMesaFileShareMetrologySi { get; set; } public string? EcMesaFileShareMetrologySi { get; set; }
public string? EcMetrologySi { get; set; }
public string? GitCommitSeven { get; set; } public string? GitCommitSeven { get; set; }
public string? InboundApiAllowedIPList { get; set; } public string? InboundApiAllowedIPList { get; set; }
public string? IqsColumns { get; set; } public string? IqsColumns { get; set; }
@ -74,6 +75,7 @@ public class AppSettings
if (appSettings.EcCharacterizationSi is null) throw new NullReferenceException(nameof(EcCharacterizationSi)); if (appSettings.EcCharacterizationSi is null) throw new NullReferenceException(nameof(EcCharacterizationSi));
if (appSettings.EcMesaFileShareCharacterizationSi is null) throw new NullReferenceException(nameof(EcMesaFileShareCharacterizationSi)); if (appSettings.EcMesaFileShareCharacterizationSi is null) throw new NullReferenceException(nameof(EcMesaFileShareCharacterizationSi));
if (appSettings.EcMesaFileShareMetrologySi is null) throw new NullReferenceException(nameof(EcMesaFileShareMetrologySi)); 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.GitCommitSeven is null) throw new NullReferenceException(nameof(GitCommitSeven));
if (appSettings.InboundApiAllowedIPList is null) throw new NullReferenceException(nameof(InboundApiAllowedIPList)); if (appSettings.InboundApiAllowedIPList is null) throw new NullReferenceException(nameof(InboundApiAllowedIPList));
if (appSettings.IqsColumns is null) throw new NullReferenceException(nameof(IqsColumns)); if (appSettings.IqsColumns is null) throw new NullReferenceException(nameof(IqsColumns));
@ -104,6 +106,7 @@ public class AppSettings
appSettings.EcCharacterizationSi, appSettings.EcCharacterizationSi,
appSettings.EcMesaFileShareCharacterizationSi, appSettings.EcMesaFileShareCharacterizationSi,
appSettings.EcMesaFileShareMetrologySi, appSettings.EcMesaFileShareMetrologySi,
appSettings.EcMetrologySi,
appSettings.GitCommitSeven, appSettings.GitCommitSeven,
appSettings.InboundApiAllowedIPList, appSettings.InboundApiAllowedIPList,
appSettings.IqsColumns, appSettings.IqsColumns,

View File

@ -6,6 +6,7 @@
<SccLocalPath>SAK</SccLocalPath> <SccLocalPath>SAK</SccLocalPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
@ -24,10 +25,10 @@
<Content Remove="compilerconfig.json" /> <Content Remove="compilerconfig.json" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Dapper" Version="2.1.24" /> <PackageReference Include="Dapper" Version="2.1.44" />
<PackageReference Include="EntityFramework" Version="6.4.4" /> <PackageReference Include="EntityFramework" Version="6.5.1" />
<PackageReference Include="jQuery" Version="3.7.1" /> <PackageReference Include="jQuery" Version="3.7.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.7" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
@ -37,9 +38,9 @@
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.0" /> <PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" /> <PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
<PackageReference Include="System.Drawing.Common" Version="8.0.0" /> <PackageReference Include="System.Drawing.Common" Version="8.0.7" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" /> <ProjectReference Include="..\Shared\OI.Metrology.Shared.csproj" />

View File

@ -74,7 +74,6 @@ public class Program
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV2Repository, InfinityQSV2Repository>(); _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV2Repository, InfinityQSV2Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV3Repository, InfinityQSV3Repository>(); _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV3Repository, InfinityQSV3Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV4Repository, InfinityQSV4Repository>(); _ = webApplicationBuilder.Services.AddSingleton<IInfinityQSV4Repository, InfinityQSV4Repository>();
_ = webApplicationBuilder.Services.AddSingleton<IWaferCounterRepository, WaferCounterRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IClientSettingsRepository>(_ => clientSettingsRepository); _ = webApplicationBuilder.Services.AddSingleton<IClientSettingsRepository>(_ => clientSettingsRepository);
_ = webApplicationBuilder.Services.AddSingleton<IServiceShopOrderRepository, ServiceShopOrderRepository>(); _ = webApplicationBuilder.Services.AddSingleton<IServiceShopOrderRepository, ServiceShopOrderRepository>();
_ = webApplicationBuilder.Services.AddSingleton<ISpreadingResistanceProfileService, SpreadingResistanceProfileService>(); _ = webApplicationBuilder.Services.AddSingleton<ISpreadingResistanceProfileService, SpreadingResistanceProfileService>();

View File

@ -2,7 +2,9 @@ using OI.Metrology.Server.Models;
using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models; using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
using System.Data;
using System.Globalization; using System.Globalization;
using System.Text;
using System.Text.Json; using System.Text.Json;
namespace OI.Metrology.Server.Repository; namespace OI.Metrology.Server.Repository;
@ -160,4 +162,86 @@ public class ExportRepository : IExportRepository
return result; return result;
} }
Result<DataTable> IExportRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
{
Result<DataTable>? r;
DateTime dateEnd = dateend is null ? DateTime.Now : DateTime.Parse(dateend);
DateTime dateBegin = datebegin is null ? dateEnd.AddMonths(-1) : DateTime.Parse(datebegin);
ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId);
if (string.IsNullOrEmpty(tt.ExportSPName))
throw new NullReferenceException(nameof(tt.ExportSPName));
DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, dateBegin, dateEnd);
r = new()
{
Results = dataTable,
TotalRows = dataTable.Rows.Count,
};
return r;
}
protected static string FormatForCSV(string v)
{
StringBuilder result = new(v.Length + 2);
bool doubleQuoted = false;
if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"'))
{
_ = result.Append('"');
doubleQuoted = true;
}
foreach (char c in v)
{
_ = c switch
{
'\r' or '\n' => result.Append(' '),
'"' => result.Append("\"\""),
_ => result.Append(c),
};
}
if (doubleQuoted)
_ = result.Append('"');
return result.ToString();
}
protected static string GetColumnHeaders(DataTable dataTable)
{
StringBuilder result = new();
for (int i = 0; i < dataTable.Columns.Count; i++)
{
if (i > 0)
_ = result.Append(',');
_ = result.Append(FormatForCSV(dataTable.Columns[i].ColumnName.TrimEnd('_')));
}
return result.ToString();
}
protected static string GetRowData(DataRow dr)
{
StringBuilder result = new();
for (int i = 0; i < dr.Table.Columns.Count; i++)
{
if (i > 0)
_ = result.Append(',');
object v = dr[i];
if (v is not null && !Convert.IsDBNull(v))
_ = result.Append(FormatForCSV(string.Concat(Convert.ToString(v))));
}
return result.ToString();
}
string IExportRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
{
string results;
Result<DataTable> result;
IExportRepository repository = this;
result = repository.GetExportData(metrologyRepository, toolTypeId, datebegin, dateend);
if (result.Results is null)
throw new NullReferenceException(nameof(result.Results));
StringBuilder stringBuilder = new();
_ = stringBuilder.AppendLine(GetColumnHeaders(result.Results));
foreach (DataRow dr in result.Results.Rows)
_ = stringBuilder.AppendLine(GetRowData(dr));
results = stringBuilder.ToString();
return results;
}
} }

View File

@ -1,6 +1,7 @@
using OI.Metrology.Shared.Models; using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
using System.Text.Json; using System.Text.Json;
using System.Web;
namespace OI.Metrology.Server.Repository; namespace OI.Metrology.Server.Repository;
@ -33,6 +34,8 @@ public class FileShareRepository : IFileShareRepository
string directory = Path.GetDirectoryName(to) ?? throw new NullReferenceException(); string directory = Path.GetDirectoryName(to) ?? throw new NullReferenceException();
if (!Directory.Exists(directory)) if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory); _ = Directory.CreateDirectory(directory);
if (File.Exists(to))
File.Move(to, $"{to}.{DateTime.Now.Ticks}.old");
File.Move(from, to); File.Move(from, to);
} }
@ -47,7 +50,9 @@ public class FileShareRepository : IFileShareRepository
void IFileShareRepository.CopyFile(HttpClient httpClient, string from, string to) void IFileShareRepository.CopyFile(HttpClient httpClient, string from, string to)
{ {
Uri uri = GetEndPoint(httpClient, "copy-file"); Uri uri = GetEndPoint(httpClient, "copy-file");
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri); string encodedTo = HttpUtility.UrlEncode(to);
string encodedFrom = HttpUtility.UrlEncode(from);
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync($"{uri.OriginalString}?from={encodedFrom}&to={encodedTo}");
httpResponseMessage.Wait(); httpResponseMessage.Wait();
if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); throw new Exception(httpResponseMessage.Result.StatusCode.ToString());
@ -56,16 +61,9 @@ public class FileShareRepository : IFileShareRepository
void IFileShareRepository.MoveFile(HttpClient httpClient, string from, string to) void IFileShareRepository.MoveFile(HttpClient httpClient, string from, string to)
{ {
Uri uri = GetEndPoint(httpClient, "move-file"); Uri uri = GetEndPoint(httpClient, "move-file");
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri); string encodedTo = HttpUtility.UrlEncode(to);
httpResponseMessage.Wait(); string encodedFrom = HttpUtility.UrlEncode(from);
if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync($"{uri.OriginalString}?from={encodedFrom}&to={encodedTo}");
throw new Exception(httpResponseMessage.Result.StatusCode.ToString());
}
void IFileShareRepository.FileWrite(HttpClient httpClient, string path, string contents)
{
Uri uri = GetEndPoint(httpClient, "file-write");
Task<HttpResponseMessage> httpResponseMessage = httpClient.GetAsync(uri);
httpResponseMessage.Wait(); httpResponseMessage.Wait();
if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception(httpResponseMessage.Result.StatusCode.ToString()); throw new Exception(httpResponseMessage.Result.StatusCode.ToString());
@ -102,4 +100,7 @@ public class FileShareRepository : IFileShareRepository
return results; return results;
} }
List<CharacterizationInfo> IFileShareRepository.GetArchiveData(CharacterizationParameters archiveParameters) =>
throw new NotImplementedException();
} }

View File

@ -31,76 +31,42 @@ public class InboundRepository : IInboundRepository
return false; return false;
} }
// this is the main endpoint, it accepts a JSON message that contains both the header and data records together DataResponse IInboundRepository.Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string toolTypeName, JsonElement? jsonElement)
// tooltype is the ToolTypeName column from the ToolType table
// JToken is how you can accept a JSON message without deserialization.
// Using "string" doesn't work because ASP.NET Core will expect a json encoded string, not give you the actual string.
DataResponse IInboundRepository.Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string tooltype, string? json)
{ {
DataResponse result = new(); DataResponse result = new();
ToolType? toolType = metrologyRepository.GetToolTypeByName(tooltype); if (jsonElement is null || jsonElement.Value.ValueKind != JsonValueKind.Object)
if (toolType is null) throw new Exception("Invalid body!");
result.Errors.Add($"Invalid tool type: {tooltype}"); string? json = jsonElement.ToString();
else JToken jToken = (string.IsNullOrEmpty(json) ? JToken.Parse("{}") : JToken.Parse(json)) ??
throw new Exception($"Invalid body: {json}");
ToolType toolType = metrologyRepository.GetToolTypeByName(toolTypeName) ??
throw new Exception($"Invalid tool type: {toolTypeName}");
List<ToolTypeMetadata> metaData = metrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList();
inboundDataService.ValidateJSONFields(jToken, 0, metaData, result.Errors, result.Warnings);
if (result.Errors.Count == 0)
{ {
InboundCommon? inboundCommon = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize<InboundCommon>(json); try
if (inboundCommon is null || string.IsNullOrEmpty(inboundCommon.ProcessDataStandardFormat))
result.Errors.Add($"Invalid body: {json}");
else
{ {
string? sourceDirectory = Path.GetDirectoryName(inboundCommon.ProcessDataStandardFormat); result.HeaderID = inboundDataService.DoSQLInsert(jToken, toolType, metaData);
string? parentDirectory = Path.GetDirectoryName(sourceDirectory); result.Success = result.HeaderID > 0;
if (string.IsNullOrEmpty(sourceDirectory) || string.IsNullOrEmpty(parentDirectory) || !Directory.Exists(parentDirectory))
result.Errors.Add($"Invalid body:path: <{inboundCommon.ProcessDataStandardFormat}>");
else
{
JToken jToken = string.IsNullOrEmpty(json) ? JToken.Parse("{}") : JToken.Parse(json);
if (jToken is null)
result.Errors.Add($"Invalid body: {json}");
else
{
List<ToolTypeMetadata> metaData = metrologyRepository.GetToolTypeMetadataByToolTypeID(toolType.ID).ToList();
if (metaData is null)
result.Errors.Add($"Invalid metadata for tool type: {tooltype}");
else
{
inboundDataService.ValidateJSONFields(jToken, 0, metaData, result.Errors, result.Warnings);
if (result.Errors.Count == 0)
{
try
{
result.HeaderID = inboundDataService.DoSQLInsert(jToken, toolType, metaData);
result.Success = result.HeaderID > 0;
string? destinationDirectory = Path.Combine(parentDirectory, result.HeaderID.ToString());
Directory.Move(sourceDirectory, destinationDirectory);
}
catch (Exception ex) { result.Errors.Add(ex.Message); }
}
}
}
}
} }
catch (Exception ex) { result.Errors.Add(ex.Message); }
} }
return result; return result;
} }
// this is the endpoint for attaching a field. It is not JSON, it is form-data/multipart like an HTML form because that's the normal way. void IInboundRepository.AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string toolTypeName, Attachment? attachment)
// header ID is the ID value from the Header table
// datauniqueid is the Title value from the Data/Detail table
string? IInboundRepository.AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string tooltype, long headerid, string datauniqueid, string fileName, object uploadedFile)
{ {
string? result = null; if (attachment is null)
ToolType toolType = metrologyRepository.GetToolTypeByName(tooltype); throw new Exception("Invalid body!");
if (toolType is null) ToolType toolType = metrologyRepository.GetToolTypeByName(toolTypeName) ??
result = $"Invalid tool type: {tooltype}"; throw new Exception($"Invalid tool type: {toolTypeName}");
string filename = Path.GetFileName(fileName); if (string.IsNullOrWhiteSpace(attachment.DestinationFileName))
if (string.IsNullOrWhiteSpace(filename)) throw new Exception("Empty filename");
result = "Empty filename"; if (attachment.DestinationFileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
if (filename.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0) throw new Exception("Invalid filename");
result = "Invalid filename"; attachmentsService.SaveAttachment(toolType, attachment);
if (result is null && toolType is not null)
attachmentsService.SaveAttachment(toolType, headerid, datauniqueid, filename, uploadedFile);
return result;
} }
} }

View File

@ -6,7 +6,6 @@ using OI.Metrology.Shared.Repositories;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Data; using System.Data;
using System.Data.Common; using System.Data.Common;
using System.Reflection;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
@ -38,124 +37,139 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
string IInfinityQSV4Repository.GetCommandText(string subGroupId) string IInfinityQSV4Repository.GetCommandText(string subGroupId)
{ // cSpell:disable { // cSpell:disable
StringBuilder result = new(); List<string> results = [];
if (string.IsNullOrEmpty(subGroupId)) if (string.IsNullOrEmpty(subGroupId))
throw new ArgumentException(null, nameof(subGroupId)); throw new ArgumentException(null, nameof(subGroupId));
_ = result results.Add(" select ");
.AppendLine(" select ") results.Add(" sd.f_sgrp sd_sgrp, ");
.AppendLine(" sd.f_sgrp sd_sgrp, ") results.Add(" sd.f_tsno sd_tsno, ");
.AppendLine(" sd.f_tsno sd_tsno, ") results.Add(" dd.f_dsgp dd_dsgp, ");
.AppendLine(" dd.f_dsgp dd_dsgp, ") results.Add(" dg.f_name gd_name, ");
.AppendLine(" dg.f_name gd_name, ") results.Add(" dd.f_name dd_name ");
.AppendLine(" dd.f_name dd_name ") results.Add(" from [SPCEPIWORLD].[dbo].[SGRP_DSC] sd ");
.AppendLine(" from [SPCEPIWORLD].[dbo].[SGRP_DSC] sd ") results.Add(" join [SPCEPIWORLD].[dbo].[DESC_DAT] dd ");
.AppendLine(" join [SPCEPIWORLD].[dbo].[DESC_DAT] dd ") results.Add(" on sd.f_dsgp = dd.f_dsgp ");
.AppendLine(" on sd.f_dsgp = dd.f_dsgp ") results.Add(" and sd.f_desc = dd.f_desc ");
.AppendLine(" and sd.f_desc = dd.f_desc ") results.Add(" join [SPCEPIWORLD].[dbo].[DESC_GRP] dg ");
.AppendLine(" join [SPCEPIWORLD].[dbo].[DESC_GRP] dg ") results.Add(" on dd.f_dsgp = dg.f_dsgp ");
.AppendLine(" on dd.f_dsgp = dg.f_dsgp "); results.Add($" where sd.f_sgrp = {subGroupId} ");
_ = result.Append(" where sd.f_sgrp = ").Append(subGroupId).AppendLine(" "); results.Add(" for json path ");
_ = result.AppendLine(" for json path "); return string.Join(' ', results);
return result.ToString();
} // cSpell:enable } // cSpell:enable
string IInfinityQSV4Repository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime) string IInfinityQSV4Repository.GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime)
{ // cSpell:disable { // cSpell:disable
StringBuilder result = new(); List<string> results = [];
const string dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; const string dateTimeFormat = "yyyy-MM-dd HH:mm:ss";
if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')) && dateTime.Length != dateTimeFormat.Length) if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')) && dateTime.Length != dateTimeFormat.Length)
throw new ArgumentException(null, nameof(dateTime)); throw new ArgumentException(null, nameof(dateTime));
_ = result results.Add(" select case when iq.sl_loos is null then 0 else iq.sl_loos end + ");
.AppendLine(" select case when iq.sl_loos is null then 0 else iq.sl_loos end + ") results.Add(" case when iq.sl_uoos is null then 0 else iq.sl_uoos end + ");
.AppendLine(" case when iq.sl_uoos is null then 0 else iq.sl_uoos end + ") results.Add(" iq.ev_count as iq_sum, ");
.AppendLine(" iq.ev_count as iq_sum, ") results.Add(" iq.sl_aflag, ");
.AppendLine(" iq.sl_aflag, ") results.Add(" iq.sl_loos, ");
.AppendLine(" iq.sl_loos, ") results.Add(" iq.sl_uoos, ");
.AppendLine(" iq.sl_uoos, ") results.Add(" iq.se_sgrp, ");
.AppendLine(" iq.se_sgrp, ") results.Add(" iq.se_sgtm, ");
.AppendLine(" iq.se_sgtm, ") results.Add(" iq.se_tsno, ");
.AppendLine(" iq.se_tsno, ") results.Add(" iq.td_test, ");
.AppendLine(" iq.td_test, ") results.Add(" iq.pr_name, ");
.AppendLine(" iq.pr_name, ") results.Add(" iq.jd_name, ");
.AppendLine(" iq.jd_name, ") results.Add(" iq.pl_name, ");
.AppendLine(" iq.pl_name, ") results.Add(" iq.pd_name, ");
.AppendLine(" iq.pd_name, ") results.Add(" iq.td_name, ");
.AppendLine(" iq.td_name, ") results.Add(" iq.se_val, ");
.AppendLine(" iq.se_val, ") results.Add(" iq.sl_eflag, ");
.AppendLine(" iq.sl_eflag, ") results.Add(" iq.sl_scal, ");
.AppendLine(" iq.sl_scal, ") results.Add(" iq.sl_sls, ");
.AppendLine(" iq.sl_sls, ") results.Add(" iq.sl_usl ");
.AppendLine(" iq.sl_usl ") results.Add(" from ( ");
.AppendLine(" from ( ") results.Add(" select ");
.AppendLine(" select ") results.Add(" se.f_sgrp se_sgrp, ");
.AppendLine(" se.f_sgrp se_sgrp, ") results.Add(" se.f_sgtm se_sgtm, ");
.AppendLine(" se.f_sgtm se_sgtm, ") results.Add(" se.f_tsno se_tsno, ");
.AppendLine(" se.f_tsno se_tsno, ") results.Add(" se.f_val se_val, ");
.AppendLine(" se.f_val se_val, ") results.Add(" pr.f_name pr_name, ");
.AppendLine(" pr.f_name pr_name, ") results.Add(" jd.f_name jd_name, ");
.AppendLine(" jd.f_name jd_name, ") results.Add(" pl.f_name pl_name, ");
.AppendLine(" pl.f_name pl_name, ") results.Add(" pd.f_name pd_name, ");
.AppendLine(" pd.f_name pd_name, ") results.Add(" td.f_test td_test, ");
.AppendLine(" td.f_test td_test, ") results.Add(" td.f_name td_name, ");
.AppendLine(" td.f_name td_name, ") results.Add(" sl.f_eflag sl_eflag, ");
.AppendLine(" sl.f_eflag sl_eflag, ") results.Add(" sl.f_aflag sl_aflag, ");
.AppendLine(" sl.f_aflag sl_aflag, ") results.Add(" sl.f_scal sl_scal, ");
.AppendLine(" sl.f_scal sl_scal, ") results.Add(" sl.f_lsl sl_sls, ");
.AppendLine(" sl.f_lsl sl_sls, ") results.Add(" sl.f_usl sl_usl, ");
.AppendLine(" sl.f_usl sl_usl, ") results.Add(" case when sl.f_aflag is null or sl.f_aflag = 0 then null else ");
.AppendLine(" case when sl.f_aflag is null or sl.f_aflag = 0 then null else ") results.Add(" case when round(se.f_val, sl.F_scal, 1) < sl.f_lsl then 1 else 0 end ");
.AppendLine(" case when round(se.f_val, sl.F_scal, 1) < sl.f_lsl then 1 else 0 end ") results.Add(" end as sl_loos, ");
.AppendLine(" end as sl_loos, ") results.Add(" case when sl.f_aflag is null or sl.f_aflag = 0 then null else ");
.AppendLine(" case when sl.f_aflag is null or sl.f_aflag = 0 then null else ") results.Add(" case when round(se.f_val, sl.F_scal, 1) > sl.f_usl then 1 else 0 end ");
.AppendLine(" case when round(se.f_val, sl.F_scal, 1) > sl.f_usl then 1 else 0 end ") results.Add(" end as sl_uoos, ");
.AppendLine(" end as sl_uoos, ") results.Add(" (select count(ev.f_evnt) ");
.AppendLine(" (select count(ev.f_evnt) ") results.Add(" from [spcepiworld].[dbo].[evnt_inf] ev ");
.AppendLine(" from [spcepiworld].[dbo].[evnt_inf] ev ") results.Add(" where ev.f_prcs = pr.f_prcs ");
.AppendLine(" where ev.f_prcs = pr.f_prcs ") results.Add(" and ev.f_part = pd.f_part ");
.AppendLine(" and ev.f_part = pd.f_part ") results.Add(" and ev.f_sgtm = se.f_sgtm ");
.AppendLine(" and ev.f_sgtm = se.f_sgtm ") results.Add(" ) ev_count ");
.AppendLine(" ) ev_count ") results.Add(" from [spcepiworld].[dbo].[sgrp_ext] se ");
.AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ") results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr ");
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ") results.Add(" on se.f_prcs = pr.f_prcs ");
.AppendLine(" on se.f_prcs = pr.f_prcs ") results.Add(" join [spcepiworld].[dbo].[job_dat] jd ");
.AppendLine(" join [spcepiworld].[dbo].[job_dat] jd ") results.Add(" on se.f_job = jd.f_job ");
.AppendLine(" on se.f_job = jd.f_job ") results.Add(" join [spcepiworld].[dbo].[part_lot] pl ");
.AppendLine(" join [spcepiworld].[dbo].[part_lot] pl ") results.Add(" on se.f_lot = pl.f_lot ");
.AppendLine(" on se.f_lot = pl.f_lot ") results.Add(" join [spcepiworld].[dbo].[part_dat] pd ");
.AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ") results.Add(" on se.f_part = pd.f_part ");
.AppendLine(" on se.f_part = pd.f_part ") results.Add(" join [spcepiworld].[dbo].[test_dat] td ");
.AppendLine(" join [spcepiworld].[dbo].[test_dat] td ") results.Add(" on se.f_test = td.f_test ");
.AppendLine(" on se.f_test = td.f_test ") results.Add(" left join [spcepiworld].[dbo].[spec_lim] sl ");
.AppendLine(" left join [spcepiworld].[dbo].[spec_lim] sl ") results.Add(" on se.f_part = sl.f_part ");
.AppendLine(" on se.f_part = sl.f_part ") results.Add(" and se.f_test = sl.f_test ");
.AppendLine(" and se.f_test = sl.f_test ") results.Add(" where se.f_flag = 0 ");
.AppendLine(" where se.f_flag = 0 ") results.Add(" and (sl.f_prcs is null or se.f_prcs = sl.f_prcs or sl.f_prcs = 0) ");
.AppendLine(" and (sl.f_prcs is null or se.f_prcs = sl.f_prcs or sl.f_prcs = 0) ");
if (!string.IsNullOrEmpty(subGroupId)) if (!string.IsNullOrEmpty(subGroupId))
_ = result.Append(" and se.f_sgrp = ").Append(subGroupId.Split(" ")[0]).AppendLine(" "); results.Add($" and se.f_sgrp = {subGroupId.Split(" ")[0]} ");
if (!string.IsNullOrEmpty(process)) if (!string.IsNullOrEmpty(process))
_ = result.Append(" and pr.f_name = '").Append(process).AppendLine("' "); results.Add($" and pr.f_name = '{process}' ");
if (!string.IsNullOrEmpty(part)) if (!string.IsNullOrEmpty(part))
_ = result.Append(" and pd.f_name = '").Append(part).AppendLine("' "); results.Add($" and pd.f_name = '{part}' ");
if (!string.IsNullOrEmpty(job)) if (!string.IsNullOrEmpty(job))
_ = result.Append(" and jd.f_name = '").Append(job).AppendLine("' "); results.Add($" and jd.f_name = '{job}' ");
if (!string.IsNullOrEmpty(lot)) if (!string.IsNullOrEmpty(lot))
_ = result.Append(" and pl.f_name = '").Append(lot).AppendLine("' "); results.Add($" and pl.f_name = '{lot}' ");
if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':'))) if (!string.IsNullOrEmpty(dateTime) && (dateTime.Contains('-') || dateTime.Contains(' ') || dateTime.Contains(':')))
_ = result.Append(" and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '").Append(dateTime).AppendLine("' "); results.Add($" and dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgtm), '19700101'))) = '{dateTime}' ");
_ = result.AppendLine(" ) as iq ") results.Add(" ) as iq ");
.AppendLine(" order by iq.sl_loos + iq.sl_uoos + iq.ev_count desc, ") results.Add(" order by iq.sl_loos + iq.sl_uoos + iq.ev_count desc, ");
.AppendLine(" iq.sl_aflag desc, ") results.Add(" iq.sl_aflag desc, ");
.AppendLine(" iq.se_sgrp, ") results.Add(" iq.se_sgrp, ");
.AppendLine(" iq.se_tsno, ") results.Add(" iq.se_tsno, ");
.AppendLine(" iq.td_test ") results.Add(" iq.td_test ");
.AppendLine(" for json path "); results.Add(" for json path ");
return result.ToString(); return string.Join(' ', results);
} // cSpell:enable } // cSpell:enable
private JsonElement[] GetAllReactorsAsJsonElementElement()
{
JsonElement[]? results;
HttpClient httpClient = _HttpClientFactory.CreateClient();
Task<string> task = httpClient.GetStringAsync($"{_OpenInsightApplicationProgrammingInterface}/reactors");
task.Wait();
JsonElement? jsonElement = JsonSerializer.Deserialize<JsonElement>(task.Result);
if (jsonElement is null)
throw new NullReferenceException(nameof(jsonElement));
string json = jsonElement.Value.EnumerateObject().First().Value.ToString();
results = JsonSerializer.Deserialize<JsonElement[]>(json);
if (results is null)
throw new NullReferenceException(nameof(results));
return results;
}
private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText, bool useIqsConnection) private static StringBuilder GetForJsonPath(IDbConnectionFactory dbConnectionFactory, string commandText, bool useIqsConnection)
{ {
StringBuilder stringBuilder = new(); StringBuilder stringBuilder = new();
File.WriteAllText("../../.sql", commandText);
using DbConnection dbConnection = dbConnectionFactory.GetDbConnection(useIqsConnection); using DbConnection dbConnection = dbConnectionFactory.GetDbConnection(useIqsConnection);
DbCommand dbCommand = dbConnection.CreateCommand(); DbCommand dbCommand = dbConnection.CreateCommand();
dbCommand.CommandText = commandText; dbCommand.CommandText = commandText;
@ -165,6 +179,50 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
return stringBuilder; return stringBuilder;
} }
private void GetOI(InfinityQSV4 infinityQSV4)
{
IInfinityQSV4Repository infinityQSV4Repository = this;
if (string.IsNullOrEmpty(infinityQSV4.Part))
throw new ArgumentException(nameof(infinityQSV4.Part));
string json = infinityQSV4Repository.GetProductionSpecification(infinityQSV4.Part);
File.WriteAllText("../../.json", json);
ProdSpecRoot? prodSpec = JsonSerializer.Deserialize(json, ProdSpecRootSourceGenerationContext.Default.ProdSpecRoot);
if (prodSpec is null)
{
if (prodSpec is null)
{ }
}
}
private static List<string> Convert(int[] night)
{
List<string> results = new();
foreach (int reactor in night)
results.Add(reactor.ToString());
return results;
}
private ReadOnlyDictionary<int, Reactor> GetReactorsMatchingType(string? reactTypeFilter)
{
Dictionary<int, Reactor> results = new();
string json;
Reactor? reactor;
JsonElement[]? jsonElements = GetAllReactorsAsJsonElementElement();
foreach (JsonElement jsonElement in jsonElements)
{
json = jsonElement.EnumerateObject().First().Value.ToString();
if (reactTypeFilter is not null && !json.Contains(reactTypeFilter))
continue;
try
{ reactor = JsonSerializer.Deserialize(json, ReactorSourceGenerationContext.Default.Reactor); }
catch (Exception) { reactor = null; }
if (reactor is null || (reactTypeFilter is not null && reactor.ReactType != reactTypeFilter))
continue;
results.Add(reactor.ReactorNo, reactor);
}
return new(results);
}
private static InfinityQSV4 GetInfinityQSV4(IDbConnectionFactory dbConnectionFactory, IInfinityQSV4Repository infinityQSV4Repository, string subGroupId) private static InfinityQSV4 GetInfinityQSV4(IDbConnectionFactory dbConnectionFactory, IInfinityQSV4Repository infinityQSV4Repository, string subGroupId)
{ {
InfinityQSV4 result; InfinityQSV4 result;
@ -235,33 +293,32 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
string IInfinityQSV4Repository.GetCommandText(InfinityQSV4 infinityQSV4) string IInfinityQSV4Repository.GetCommandText(InfinityQSV4 infinityQSV4)
{ // cSpell:disable { // cSpell:disable
StringBuilder result = new(); List<string> results = [];
if (string.IsNullOrEmpty(infinityQSV4.Process)) if (string.IsNullOrEmpty(infinityQSV4.Process))
throw new ArgumentException(nameof(infinityQSV4.Process)); throw new ArgumentException(nameof(infinityQSV4.Process));
if (string.IsNullOrEmpty(infinityQSV4.Part)) if (string.IsNullOrEmpty(infinityQSV4.Part))
throw new ArgumentException(nameof(infinityQSV4.Part)); throw new ArgumentException(nameof(infinityQSV4.Part));
_ = result results.Add(" select ");
.AppendLine(" select ") results.Add(" ev.f_evnt [ev_evnt], ");
.AppendLine(" ev.f_evnt [ev_evnt], ") results.Add(" ev.f_sgtm [ev_sgtm], ");
.AppendLine(" ev.f_sgtm [ev_sgtm], ") results.Add(" dateadd(HH, -7, (dateadd(SS, convert(bigint, ev.f_sgtm), '19700101'))) [ev_utc7], ");
.AppendLine(" dateadd(HH, -7, (dateadd(SS, convert(bigint, ev.f_sgtm), '19700101'))) [ev_utc7], ") results.Add(" pr.f_name [pr_name], ");
.AppendLine(" pr.f_name [pr_name], ") results.Add(" pd.f_name [pd_name], ");
.AppendLine(" pd.f_name [pd_name], ") results.Add(" td.f_test [td_test], ");
.AppendLine(" td.f_test [td_test], ") results.Add(" td.f_name [td_name], ");
.AppendLine(" td.f_name [td_name], ") results.Add(" ev.f_name [ev_name] ");
.AppendLine(" ev.f_name [ev_name] ") results.Add(" from [spcepiworld].[dbo].[evnt_inf] ev ");
.AppendLine(" from [spcepiworld].[dbo].[evnt_inf] ev ") results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr ");
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ") results.Add(" on ev.f_prcs = pr.f_prcs ");
.AppendLine(" on ev.f_prcs = pr.f_prcs ") results.Add(" join [spcepiworld].[dbo].[part_dat] pd ");
.AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ") results.Add(" on ev.f_part = pd.f_part ");
.AppendLine(" on ev.f_part = pd.f_part ") results.Add(" join [spcepiworld].[dbo].[test_dat] td ");
.AppendLine(" join [spcepiworld].[dbo].[test_dat] td ") results.Add(" on ev.f_test = td.f_test ");
.AppendLine(" on ev.f_test = td.f_test ") results.Add($" where pr.f_name = '{infinityQSV4.Process}' ");
.Append(" where pr.f_name = '").Append(infinityQSV4.Process).AppendLine("' ") results.Add($" and pd.f_name = '{infinityQSV4.Part}' ");
.Append(" and pd.f_name = '").Append(infinityQSV4.Part).AppendLine("' ") results.Add($" and ev.f_sgtm = {infinityQSV4.SubGroupDateTime} ");
.Append(" and ev.f_sgtm = ").Append(infinityQSV4.SubGroupDateTime).AppendLine(" ") results.Add(" for json path ");
.AppendLine(" for json path "); return string.Join(' ', results);
return result.ToString();
} // cSpell:enable } // cSpell:enable
Result<InfinityQSV4[]> IInfinityQSV4Repository.GetHeader(string subGroupId) Result<InfinityQSV4[]> IInfinityQSV4Repository.GetHeader(string subGroupId)
@ -290,28 +347,27 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
string IInfinityQSV4Repository.GetCommandText(string process, string? part) string IInfinityQSV4Repository.GetCommandText(string process, string? part)
{ // cSpell:disable { // cSpell:disable
StringBuilder result = new(); List<string> results = [];
if (string.IsNullOrEmpty(process)) if (string.IsNullOrEmpty(process))
throw new ArgumentException(null, nameof(process)); throw new ArgumentException(null, nameof(process));
if (string.IsNullOrEmpty(part)) if (string.IsNullOrEmpty(part))
throw new ArgumentException(null, nameof(part)); throw new ArgumentException(null, nameof(part));
_ = result results.Add(" select [f_mean] as ProcessMean, ");
.AppendLine(" select [f_mean] as ProcessMean, ") results.Add(" [f_sp] as ProcessSigma ");
.AppendLine(" [f_sp] as ProcessSigma ") results.Add(" from [spcepiworld].[dbo].[test_dat] test ");
.AppendLine(" from [spcepiworld].[dbo].[test_dat] test ") results.Add(" join [spcepiworld].[dbo].[ctrl_lim] ctrl ");
.AppendLine(" join [spcepiworld].[dbo].[ctrl_lim] ctrl ") results.Add(" on test.f_test = ctrl.f_test ");
.AppendLine(" on test.f_test = ctrl.f_test ") results.Add(" and test.f_tsgp = 1104848523 /* Product Data */ ");
.AppendLine(" and test.f_tsgp = 1104848523 /* Product Data */ ") results.Add(" join [spcepiworld].[dbo].[part_dat] part ");
.AppendLine(" join [spcepiworld].[dbo].[part_dat] part ") results.Add(" on part.f_part = ctrl.f_part ");
.AppendLine(" on part.f_part = ctrl.f_part ") results.Add(" and ctrl.f_test = 1125073605 /* Average Sum of Defects */ ");
.AppendLine(" and ctrl.f_test = 1125073605 /* Average Sum of Defects */ ") results.Add(" join [spcepiworld].[dbo].[prcs_dat] process ");
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] process ") results.Add(" on process.f_prcs = ctrl.f_prcs ");
.AppendLine(" on process.f_prcs = ctrl.f_prcs ") results.Add(" where test.f_name = 'Average Sum of Defects' ");
.AppendLine(" where test.f_name = 'Average Sum of Defects' ") results.Add($" and process.f_name = '{process}' ");
.Append(" and process.f_name = '").Append(process).AppendLine("' ") results.Add($" and part.f_name = '{part}' ");
.Append(" and part.f_name = '").Append(part).AppendLine("' ") results.Add(" for json path; ");
.AppendLine(" for json path; "); return string.Join(' ', results);
return result.ToString();
} // cSpell:enable } // cSpell:enable
string IInfinityQSV4Repository.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe) string IInfinityQSV4Repository.GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe)
@ -333,102 +389,56 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
return result.ToString(); return result.ToString();
} }
private JsonElement[] GetAllReactorsAsJsonElementElement()
{
JsonElement[]? results;
HttpClient httpClient = _HttpClientFactory.CreateClient();
Task<string> task = httpClient.GetStringAsync($"{_OpenInsightApplicationProgrammingInterface}/reactors");
task.Wait();
JsonElement? jsonElement = JsonSerializer.Deserialize<JsonElement>(task.Result);
if (jsonElement is null)
throw new NullReferenceException(nameof(jsonElement));
string json = jsonElement.Value.EnumerateObject().First().Value.ToString();
results = JsonSerializer.Deserialize<JsonElement[]>(json);
if (results is null)
throw new NullReferenceException(nameof(results));
return results;
}
private ReadOnlyDictionary<int, Reactor> GetReactorsMatchingType(string? reactTypeFilter)
{
Dictionary<int, Reactor> results = new();
string json;
Reactor? reactor;
JsonElement[]? jsonElements = GetAllReactorsAsJsonElementElement();
foreach (JsonElement jsonElement in jsonElements)
{
json = jsonElement.EnumerateObject().First().Value.ToString();
if (reactTypeFilter is not null && !json.Contains(reactTypeFilter))
continue;
try
{ reactor = JsonSerializer.Deserialize(json, ReactorSourceGenerationContext.Default.Reactor); }
catch (Exception) { reactor = null; }
if (reactor is null || (reactTypeFilter is not null && reactor.ReactType != reactTypeFilter))
continue;
results.Add(reactor.ReactorNo, reactor);
}
return new(results);
}
string IInfinityQSV4Repository.GetCommandText(List<string> eppReactorNumbers) string IInfinityQSV4Repository.GetCommandText(List<string> eppReactorNumbers)
{ // cSpell:disable { // cSpell:disable
StringBuilder result = new(); List<string> results = [];
_ = result results.Add(" select se.f_sgrp, ");
.AppendLine(" select se.f_sgrp, ") results.Add(" dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgrp), '19700101'))) date_time, ");
.AppendLine(" dateadd(HH, -7, (dateadd(SS, convert(bigint, se.f_sgrp), '19700101'))) date_time, ") results.Add(" iq.pr_name, ");
.AppendLine(" iq.pr_name, ") results.Add(" iq.pd_name, ");
.AppendLine(" iq.pd_name, ") results.Add(" max(case ");
.AppendLine(" max(case ") results.Add(" when td.f_test = 1104769646 ");
.AppendLine(" when td.f_test = 1104769646 ") results.Add(" then se.f_val ");
.AppendLine(" then se.f_val ") results.Add(" else null ");
.AppendLine(" else null ") results.Add(" end) as iq_value, ");
.AppendLine(" end) as iq_value, ") results.Add(" max(case ");
.AppendLine(" max(case ") results.Add(" when td.f_test = 1312288843 ");
.AppendLine(" when td.f_test = 1312288843 ") results.Add(" then se.f_val else null ");
.AppendLine(" then se.f_val else null ") results.Add(" end) as iq_temp_offset_percent ");
.AppendLine(" end) as iq_temp_offset_percent ") results.Add(" from ( ");
.AppendLine(" from ( ") results.Add(" select ");
.AppendLine(" select ") results.Add(" max(se.f_sgrp) se_max_sgrp, ");
.AppendLine(" max(se.f_sgrp) se_max_sgrp, ") results.Add(" se.f_test se_test, ");
.AppendLine(" se.f_test se_test, ") results.Add(" pr.f_name pr_name, ");
.AppendLine(" pr.f_name pr_name, ") results.Add(" pd.f_name pd_name ");
.AppendLine(" pd.f_name pd_name ") results.Add(" from [spcepiworld].[dbo].[sgrp_ext] se ");
.AppendLine(" from [spcepiworld].[dbo].[sgrp_ext] se ") results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr ");
.AppendLine(" join [spcepiworld].[dbo].[prcs_dat] pr ") results.Add(" on se.f_prcs = pr.f_prcs ");
.AppendLine(" on se.f_prcs = pr.f_prcs ") results.Add(" join [spcepiworld].[dbo].[part_dat] pd ");
.AppendLine(" join [spcepiworld].[dbo].[part_dat] pd ") results.Add(" on se.f_part = pd.f_part ");
.AppendLine(" on se.f_part = pd.f_part ") results.Add(" where se.f_flag = 0 ");
.AppendLine(" where se.f_flag = 0 ") results.Add($" and pr.f_name in ({string.Join(',', eppReactorNumbers)}) ");
.Append(" and pr.f_name in (").Append(string.Join(',', eppReactorNumbers)).AppendLine(") ") results.Add(" and pd.f_name = '1090 - Full Load' ");
.AppendLine(" and pd.f_name = '1090 - Full Load' ") results.Add(" and se.f_test in (1104769646, 1312288843) ");
.AppendLine(" and se.f_test in (1104769646, 1312288843) ") results.Add(" group by se.f_test, ");
.AppendLine(" group by se.f_test, ") results.Add(" pr.f_name, ");
.AppendLine(" pr.f_name, ") results.Add(" pd.f_name ");
.AppendLine(" pd.f_name ") results.Add(" ) as iq ");
.AppendLine(" ) as iq ") results.Add(" join [spcepiworld].[dbo].[sgrp_ext] se ");
.AppendLine(" join [spcepiworld].[dbo].[sgrp_ext] se ") results.Add(" on iq.se_max_sgrp = se.f_sgrp ");
.AppendLine(" on iq.se_max_sgrp = se.f_sgrp ") results.Add(" join [spcepiworld].[dbo].[test_dat] td ");
.AppendLine(" join [spcepiworld].[dbo].[test_dat] td ") results.Add(" on iq.se_test = td.f_test ");
.AppendLine(" on iq.se_test = td.f_test ") results.Add(" and se.f_test = td.f_test ");
.AppendLine(" and se.f_test = td.f_test ") results.Add(" where se.f_flag = 0 ");
.AppendLine(" where se.f_flag = 0 ") results.Add(" and td.f_test in (1104769646, 1312288843) ");
.AppendLine(" and td.f_test in (1104769646, 1312288843) ") results.Add(" group by se.f_sgrp, ");
.AppendLine(" group by se.f_sgrp, ") results.Add(" iq.pr_name, ");
.AppendLine(" iq.pr_name, ") results.Add(" iq.pd_name ");
.AppendLine(" iq.pd_name ") results.Add(" order by iq.pr_name ");
.AppendLine(" order by iq.pr_name ") results.Add(" for json path; ");
.AppendLine(" for json path; "); return string.Join(' ', results);
return result.ToString();
} // cSpell:enable } // cSpell:enable
private static List<string> Convert(int[] night)
{
List<string> results = new();
foreach (int reactor in night)
results.Add(reactor.ToString());
return results;
}
List<string[]> IInfinityQSV4Repository.GetEpiProTempVerificationRows(int[] night) List<string[]> IInfinityQSV4Repository.GetEpiProTempVerificationRows(int[] night)
{ {
List<string[]>? results; List<string[]>? results;
@ -638,171 +648,55 @@ public class InfinityQSV4Repository : IInfinityQSV4Repository
return result; return result;
} }
private void GetOI(InfinityQSV4 infinityQSV4) private static string GetCommandText(string process, string? part, int? test)
{ { // cSpell:disable
IInfinityQSV4Repository infinityQSV4Repository = this; List<string> results = [];
if (string.IsNullOrEmpty(infinityQSV4.Part)) if (string.IsNullOrEmpty(process))
throw new ArgumentException(nameof(infinityQSV4.Part)); throw new ArgumentException(null, nameof(process));
string json = infinityQSV4Repository.GetProductionSpecification(infinityQSV4.Part); if (string.IsNullOrEmpty(part))
ProdSpecRoot? prodSpec = JsonSerializer.Deserialize(json, ProdSpecRootSourceGenerationContext.Default.ProdSpecRoot); throw new ArgumentException(null, nameof(part));
if (prodSpec is null) if (test is null)
{ throw new ArgumentException(null, nameof(test));
if (prodSpec is null) results.Add(" select se_max_sgrp, se.f_val se_value ");
{ } results.Add(" from ( ");
} results.Add(" select ");
} results.Add(" max(se.f_sgrp) se_max_sgrp ");
results.Add(" from [spcepiworld].[dbo].[sgrp_ext] se ");
results.Add(" join [spcepiworld].[dbo].[prcs_dat] pr ");
results.Add(" on se.f_prcs = pr.f_prcs ");
results.Add(" join [spcepiworld].[dbo].[part_dat] pd ");
results.Add(" on se.f_part = pd.f_part ");
results.Add(" where se.f_flag = 0 ");
results.Add(" and se.f_tsno = 1 ");
results.Add($" and pr.f_name = '{process}' ");
results.Add($" and pd.f_name = '{part}' ");
results.Add($" and se.f_test = {test.Value} ");
results.Add(" ) as iq ");
results.Add(" join [spcepiworld].[dbo].[sgrp_ext] se ");
results.Add(" on se_max_sgrp = se.f_sgrp ");
results.Add(" where se.f_flag = 0 ");
results.Add(" and se.f_tsno = 1 ");
results.Add($" and se.f_test = {test.Value} ");
results.Add(" for json path ");
return string.Join(' ', results);
} // cSpell:enable
private static Record? GetValue(AppSettings appSettings, string line) string IInfinityQSV4Repository.GetLastGroupIdWithValue(string process, string? part, int? test)
{ {
Record? result; StringBuilder result;
string[] attributes = line.Split('>');
if (attributes.Length != 3)
result = null;
else
{
string[] text = attributes[1].Replace(appSettings.IqsRed, "red").Replace(appSettings.IqsYellow, "Yellow").Split($"</{line[1]}{line[2]}");
if (text.Length != 2)
result = null;
else
{
string[] attributeValues = attributes[0].Split('"');
if (attributeValues.Length != 3)
result = new(null, text[0]);
else
{
result = new(attributeValues[1], text[0]);
}
}
}
return result;
}
private static ReadOnlyCollection<Record> GetRecords(AppSettings appSettings, string[] lines)
{
Record? record;
List<Record> results = new();
List<string> checkColumns = new();
foreach (string line in lines)
{
if (line.StartsWith("<th"))
{
record = GetValue(appSettings, line);
if (record is null)
continue;
checkColumns.Add(record.Text);
}
if (line.StartsWith("<td"))
{
record = GetValue(appSettings, line);
if (record is null)
continue;
results.Add(record);
}
}
if (string.Join(',', checkColumns) != appSettings.IqsColumns)
throw new NotSupportedException("Columns don't match!");
return new(results);
}
private static List<Dictionary<string, Record>> GetCollection(string columns, ReadOnlyCollection<Record> records)
{
string[] columnNames = columns.Split(',');
List<Dictionary<string, Record>> collection = new();
Dictionary<string, Record> keyValuePairs;
for (int i = 0; i < records.Count; i++)
{
keyValuePairs = new();
for (int j = 0; j < columnNames.Length; j++)
{
keyValuePairs.Add(columnNames[j], records[i]);
i++;
}
i--;
collection.Add(keyValuePairs);
}
return collection;
}
private static Dictionary<string, List<string>> GetResults(AppSettings appSettings, List<Dictionary<string, Record>> collection)
{
Dictionary<string, List<string>> results = new();
Record record;
List<string>? colors;
foreach (Dictionary<string, Record> keyValuePairs in collection)
{
record = keyValuePairs[appSettings.IqsKey];
if (!results.TryGetValue(record.Text, out colors))
{
results.Add(record.Text, new());
if (!results.TryGetValue(record.Text, out colors))
throw new Exception();
}
if (record.Color is null)
continue;
colors.Add(record.Color.Replace(appSettings.IqsRed, "red").Replace(appSettings.IqsYellow, "Yellow"));
}
foreach (KeyValuePair<string, List<string>> keyValuePair in results)
keyValuePair.Value.Sort();
return results;
}
private void FileFindReplaceAndSave(FileInfo fileInfo, string value)
{
string lines = value.Replace(_AppSettings.IqsRed, "red").Replace(_AppSettings.IqsYellow, "Yellow");
File.WriteAllText(fileInfo.FullName, lines);
}
private static string GetWwwRootDirectory()
{
string result;
Assembly assembly = Assembly.GetExecutingAssembly();
string? assemblyName = assembly.GetName()?.Name;
if (string.IsNullOrEmpty(assemblyName))
throw new Exception();
result = Path.Combine(AppContext.BaseDirectory, "wwwroot");
if (!Directory.Exists(result))
_ = Directory.CreateDirectory(result);
return result;
}
Dictionary<string, List<string>> IInfinityQSV4Repository.GetEngineeringSpcReview()
{
Dictionary<string, List<string>>? results;
if (!string.IsNullOrEmpty(_MockRoot)) if (!string.IsNullOrEmpty(_MockRoot))
{ {
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetEngineeringSpcReview)}.json")); string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IInfinityQSV4Repository.GetLastGroupIdWithValue)}.json"));
results = JsonSerializer.Deserialize<Dictionary<string, List<string>>>(json); result = new(json);
if (results is null)
throw new NullReferenceException(nameof(results));
} }
else else
{ {
string wwwRootDirectory = GetWwwRootDirectory(); string commandText = GetCommandText(process, part, test);
HttpClient httpClient = _HttpClientFactory.CreateClient(); result = GetForJsonPath(_DBConnectionFactory, commandText, useIqsConnection: false);
FileInfo localFileInfo = new(Path.Combine(wwwRootDirectory, _AppSettings.IqsFileSegments.Last())); if (result.Length == 0)
Uri uri = _FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareCharacterizationSi), _AppSettings.IqsFileSegments[0..^1]); result = new("{}");
List<NginxFileSystemSortable> nginxFileSystemSortableCollection = _FileShareRepository.GetNginxFileSystemSortableCollection(httpClient, uri, ".html");
if (!localFileInfo.Exists && nginxFileSystemSortableCollection.Count == 0)
results = new();
else
{
string[] lines;
HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, nginxFileSystemSortableCollection[0].Uri);
Task<string> value = httpResponseMessage.Content.ReadAsStringAsync();
value.Wait();
if (localFileInfo.Exists && localFileInfo.LastWriteTime == nginxFileSystemSortableCollection[0].DateTime)
lines = File.ReadAllLines(localFileInfo.FullName);
else
{
FileFindReplaceAndSave(localFileInfo, value.Result);
lines = value.Result.Split("\r\n");
}
ReadOnlyCollection<Record> records = GetRecords(_AppSettings, lines);
List<Dictionary<string, Record>> collection = GetCollection(_AppSettings.IqsColumns, records);
results = GetResults(_AppSettings, collection);
}
} }
return results; return result.ToString();
} }
} }

View File

@ -16,6 +16,7 @@ namespace OI.Metrology.Server.Repositories;
public class MetrologyRepository : IMetrologyRepository public class MetrologyRepository : IMetrologyRepository
{ {
private readonly string _MockRoot; private readonly string _MockRoot;
private readonly string _RepositoryName; private readonly string _RepositoryName;
private readonly IMemoryCache _MemoryCache; private readonly IMemoryCache _MemoryCache;
@ -32,7 +33,8 @@ public class MetrologyRepository : IMetrologyRepository
protected DbProviderFactory GetDbProviderFactory(IDbConnection conn) => protected DbProviderFactory GetDbProviderFactory(IDbConnection conn) =>
DbProviderFactories.GetFactory(conn.GetType().Namespace); DbProviderFactories.GetFactory(conn.GetType().Namespace);
internal static TransactionScope StartTransaction() => new(); internal static TransactionScope StartTransaction() =>
new();
protected void CacheItem(string key, object v) protected void CacheItem(string key, object v)
{ {
@ -56,7 +58,7 @@ public class MetrologyRepository : IMetrologyRepository
return r; return r;
} }
internal ToolType GetToolTypeByName(string name) ToolType IMetrologyRepository.GetToolTypeByName(string name)
{ {
ToolType cached; ToolType cached;
string cacheKey = "GetToolTypeByName_" + name; string cacheKey = "GetToolTypeByName_" + name;
@ -107,7 +109,7 @@ public class MetrologyRepository : IMetrologyRepository
return r; return r;
} }
internal long InsertToolDataJSON(JToken jsonrow, long headerId, List<ToolTypeMetadata> metaData, string tableName) long IMetrologyRepository.InsertToolDataJSON(JToken jsonrow, long headerId, List<ToolTypeMetadata> metaData, string tableName)
{ {
long r = -1; long r = -1;
using (DbConnection conn = _DBConnectionFactory.GetDbConnection()) using (DbConnection conn = _DBConnectionFactory.GetDbConnection())
@ -115,7 +117,8 @@ public class MetrologyRepository : IMetrologyRepository
bool isHeader = headerId <= 0; bool isHeader = headerId <= 0;
// get fields from metadata // get fields from metadata
List<ToolTypeMetadata> fields = metaData.Where(md => md.Header == isHeader).ToList(); List<ToolTypeMetadata> fields = metaData.Where(md =>
md.Header == isHeader).ToList();
// maps ApiName to ColumnName // maps ApiName to ColumnName
Dictionary<string, string> fieldmap = new(); Dictionary<string, string> fieldmap = new();
@ -155,7 +158,8 @@ public class MetrologyRepository : IMetrologyRepository
else else
{ {
// Find the container field in the json // Find the container field in the json
JProperty contJP = jsonrow.Children<JProperty>().Where(c => string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); JProperty contJP = jsonrow.Children<JProperty>().Where(c =>
string.Equals(c.Name.Trim(), containerField, StringComparison.OrdinalIgnoreCase)).SingleOrDefault();
if ((contJP is not null) && (contJP.Value is JArray array)) if ((contJP is not null) && (contJP.Value is JArray array))
{ {
@ -182,7 +186,7 @@ public class MetrologyRepository : IMetrologyRepository
_ = cmd.Parameters.Add(p); _ = cmd.Parameters.Add(p);
} }
protected long InsertRowFromJSON( private long InsertRowFromJSON(
IDbConnection conn, IDbConnection conn,
string tableName, string tableName,
JToken jsonrow, JToken jsonrow,
@ -262,7 +266,7 @@ public class MetrologyRepository : IMetrologyRepository
return Convert.ToInt64(o); return Convert.ToInt64(o);
} }
internal DataTable ExportData(string spName, DateTime startTime, DateTime endTime) DataTable IMetrologyRepository.ExportData(string spName, DateTime startTime, DateTime endTime)
{ {
DataTable dt = new(); DataTable dt = new();
DateTime endTimeLocal = endTime.ToLocalTime(); DateTime endTimeLocal = endTime.ToLocalTime();
@ -312,7 +316,7 @@ public class MetrologyRepository : IMetrologyRepository
return sb.ToString(); return sb.ToString();
} }
internal DataTable GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords) DataTable IMetrologyRepository.GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerId, out long totalRecords)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
@ -324,7 +328,8 @@ public class MetrologyRepository : IMetrologyRepository
StringBuilder sb = new(); StringBuilder sb = new();
_ = sb.Append( _ = sb.Append(
FormDynamicSelectQuery( FormDynamicSelectQuery(
md.Where(m => m.Header == true).ToList(), md.Where(m =>
m.Header == true).ToList(),
tt.HeaderTableName) tt.HeaderTableName)
); );
@ -401,7 +406,7 @@ public class MetrologyRepository : IMetrologyRepository
return dt; return dt;
} }
internal DataTable GetData(int toolTypeId, long headerid) DataTable IMetrologyRepository.GetData(int toolTypeId, long headerid)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
@ -413,7 +418,9 @@ public class MetrologyRepository : IMetrologyRepository
StringBuilder sb = new(); StringBuilder sb = new();
_ = sb.Append( _ = sb.Append(
FormDynamicSelectQuery( FormDynamicSelectQuery(
md.Where(m => m.Header == false).OrderBy(m => m.GridDisplayOrder).ToList(), md.Where(m =>
m.Header == false).OrderBy(m =>
m.GridDisplayOrder).ToList(),
tt.DataTableName) tt.DataTableName)
); );
@ -492,17 +499,32 @@ public class MetrologyRepository : IMetrologyRepository
return dt; return dt;
} }
internal Guid GetHeaderAttachmentID(int toolTypeId, long headerId) Guid IMetrologyRepository.GetHeaderAttachmentID(int toolTypeId, long headerId)
{
Guid result;
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
using DbConnection conn = _DBConnectionFactory.GetDbConnection();
string sql =
$"SELECT AttachmentID FROM [{tt.HeaderTableName}] WHERE ID = @HeaderID";
result = conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId });
return result;
}
void IMetrologyRepository.SetHeaderAttachmentID(int toolTypeId, long headerId, string attachmentId)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
using DbConnection conn = _DBConnectionFactory.GetDbConnection(); using DbConnection conn = _DBConnectionFactory.GetDbConnection();
string sql = string sql =
$"UPDATE [{tt.HeaderTableName}] SET AttachmentID = NEWID() WHERE ID = @HeaderID AND AttachmentID IS NULL; " + $"UPDATE [{tt.HeaderTableName}] SET AttachmentID = @AttachmentID WHERE ID = @HeaderID AND AttachmentID IS NULL; " +
$"SELECT AttachmentID FROM [{tt.HeaderTableName}] WHERE ID = @HeaderID"; $"SELECT AttachmentID FROM [{tt.HeaderTableName}] WHERE ID = @HeaderID";
return conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId }); Guid guid = conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, AttachmentID = attachmentId });
if (attachmentId != guid.ToString())
throw new NotSupportedException($"{attachmentId} != {guid}");
} }
internal string GetHeaderInsertDate(int toolTypeId, long headerId)
string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
@ -511,7 +533,8 @@ public class MetrologyRepository : IMetrologyRepository
$"SELECT CONVERT(varchar, case when [InsertDate] < [Date] or [Date] is null then [InsertDate] else [Date] end, 120) d FROM[{tt.HeaderTableName}] where ID = @HeaderID"; $"SELECT CONVERT(varchar, case when [InsertDate] < [Date] or [Date] is null then [InsertDate] else [Date] end, 120) d FROM[{tt.HeaderTableName}] where ID = @HeaderID";
return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId }); return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId });
} }
internal string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId)
string IMetrologyRepository.GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId)
{ {
using DbConnection conn = _DBConnectionFactory.GetDbConnection(); using DbConnection conn = _DBConnectionFactory.GetDbConnection();
string sql = ""; string sql = "";
@ -526,24 +549,27 @@ public class MetrologyRepository : IMetrologyRepository
return conn.ExecuteScalar<string>(sql, param: new { AttachmentID = attachmentId }); return conn.ExecuteScalar<string>(sql, param: new { AttachmentID = attachmentId });
} }
internal void SetHeaderDirName(string tableName, long headerId, string dateDir)
void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir)
{ {
using DbConnection conn = _DBConnectionFactory.GetDbConnection(); using DbConnection conn = _DBConnectionFactory.GetDbConnection();
_ = conn.Execute($"UPDATE [{tableName}] SET AttachDirName = @AttachDirName WHERE ID = @HeaderID;", new { HeaderID = headerId, AttachDirName = dateDir }); _ = conn.Execute($"UPDATE [{tableName}] SET AttachDirName = @AttachDirName WHERE ID = @HeaderID;", new { HeaderID = headerId, AttachDirName = dateDir });
} }
internal Guid GetDataAttachmentID(int toolTypeId, long headerId, string title) void IMetrologyRepository.SetDataAttachmentID(int toolTypeId, long headerId, string title, string attachmentId)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
using DbConnection conn = _DBConnectionFactory.GetDbConnection(); using DbConnection conn = _DBConnectionFactory.GetDbConnection();
string sql = string sql =
$"UPDATE [{tt.DataTableName}] SET AttachmentID = NEWID() WHERE HeaderID = @HeaderID AND Title = @Title AND AttachmentID IS NULL; " + $"UPDATE [{tt.DataTableName}] SET AttachmentID = @AttachmentID WHERE HeaderID = @HeaderID AND Title = @Title AND AttachmentID IS NULL; " +
$"SELECT AttachmentID FROM [{tt.DataTableName}] WHERE HeaderID = @HeaderID AND Title = @Title"; $"SELECT AttachmentID FROM [{tt.DataTableName}] WHERE HeaderID = @HeaderID AND Title = @Title";
return conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, Title = title }); Guid guid = conn.ExecuteScalar<Guid>(sql, param: new { HeaderID = headerId, AttachmentID = attachmentId, Title = title });
if (attachmentId != guid.ToString())
throw new NotSupportedException($"{attachmentId} != {guid}");
} }
// J Ouellette Added
internal string GetDataInsertDate(int toolTypeId, long headerId, string title) string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
@ -560,7 +586,8 @@ public class MetrologyRepository : IMetrologyRepository
return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId, Title = title }); return conn.ExecuteScalar<string>(sql, param: new { HeaderID = headerId, Title = title });
} }
internal void SetDataDirName(string tableName, long headerId, string title, string dateDir)
void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir)
{ {
using DbConnection conn = _DBConnectionFactory.GetDbConnection(); using DbConnection conn = _DBConnectionFactory.GetDbConnection();
string sql = string sql =
@ -568,13 +595,13 @@ public class MetrologyRepository : IMetrologyRepository
_ = conn.Execute(sql, param: new { HeaderID = headerId, Title = title, AttachDirName = dateDir }); _ = conn.Execute(sql, param: new { HeaderID = headerId, Title = title, AttachDirName = dateDir });
} }
internal void PurgeExistingData(int toolTypeId, string title) void IMetrologyRepository.PurgeExistingData(int toolTypeId, string title)
{ {
using DbConnection conn = _DBConnectionFactory.GetDbConnection(); using DbConnection conn = _DBConnectionFactory.GetDbConnection();
_ = conn.Execute("PurgeExistingData", param: new { ToolTypeID = toolTypeId, Title = title }, commandType: CommandType.StoredProcedure); _ = conn.Execute("PurgeExistingData", param: new { ToolTypeID = toolTypeId, Title = title }, commandType: CommandType.StoredProcedure);
} }
internal DataSet GetOIExportData(int toolTypeId, long headerid) DataSet IMetrologyRepository.GetOIExportData(int toolTypeId, long headerid)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
@ -626,7 +653,7 @@ public class MetrologyRepository : IMetrologyRepository
return results.ToArray(); return results.ToArray();
} }
internal HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords) HeaderCommon[] IMetrologyRepository.GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords)
{ {
HeaderCommon[] headers; HeaderCommon[] headers;
if (toolTypeId is not null && (pageNo is not null || pageSize is not null)) if (toolTypeId is not null && (pageNo is not null || pageSize is not null))
@ -662,7 +689,7 @@ public class MetrologyRepository : IMetrologyRepository
return headers; return headers;
} }
internal IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid) IEnumerable<KeyValuePair<string, string>> IMetrologyRepository.GetHeaderFields(int toolTypeId, long headerid)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
@ -689,7 +716,9 @@ public class MetrologyRepository : IMetrologyRepository
if (dt.Rows.Count > 0) if (dt.Rows.Count > 0)
dr = dt.Rows[0]; dr = dt.Rows[0];
foreach (ToolTypeMetadata m in md.Where(m => m.Header == true && m.TableDisplayOrder > 0).OrderBy(m => m.TableDisplayOrder)) foreach (ToolTypeMetadata m in md.Where(m =>
m.Header == true && m.TableDisplayOrder > 0).OrderBy(m =>
m.TableDisplayOrder))
{ {
string v = ""; string v = "";
if (dr is not null) if (dr is not null)
@ -705,7 +734,7 @@ public class MetrologyRepository : IMetrologyRepository
return r; return r;
} }
internal IEnumerable<AwaitingDisposition> GetAwaitingDisposition() IEnumerable<AwaitingDisposition> IMetrologyRepository.GetAwaitingDisposition()
{ {
IEnumerable<AwaitingDisposition>? r; IEnumerable<AwaitingDisposition>? r;
if (!string.IsNullOrEmpty(_MockRoot)) if (!string.IsNullOrEmpty(_MockRoot))
@ -723,7 +752,7 @@ public class MetrologyRepository : IMetrologyRepository
return r; return r;
} }
internal int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) int IMetrologyRepository.UpdateReviewDate(int toolTypeId, long headerId, bool clearDate)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
@ -743,7 +772,7 @@ public class MetrologyRepository : IMetrologyRepository
} }
} }
internal Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title) Guid IMetrologyRepository.GetHeaderAttachmentIDByTitle(int toolTypeId, string title)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
@ -753,7 +782,7 @@ public class MetrologyRepository : IMetrologyRepository
return conn.ExecuteScalar<Guid>(sql, param: new { Title = title }); return conn.ExecuteScalar<Guid>(sql, param: new { Title = title });
} }
internal Guid GetDataAttachmentIDByTitle(int toolTypeId, string title) Guid IMetrologyRepository.GetDataAttachmentIDByTitle(int toolTypeId, string title)
{ {
ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType tt = GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
@ -763,31 +792,13 @@ public class MetrologyRepository : IMetrologyRepository
return conn.ExecuteScalar<Guid>(sql, param: new { Title = title }); return conn.ExecuteScalar<Guid>(sql, param: new { Title = title });
} }
DataTable IMetrologyRepository.GetDataSharePoint(int toolTypeId, string headerId) => throw new NotImplementedException(); IEnumerable<ToolType> IMetrologyRepository.GetToolTypes() =>
GetToolTypes();
IEnumerable<ToolType> IMetrologyRepository.GetToolTypes() => GetToolTypes(); ToolType IMetrologyRepository.GetToolTypeByID(int id) =>
ToolType IMetrologyRepository.GetToolTypeByName(string name) => GetToolTypeByName(name); GetToolTypeByID(id);
ToolType IMetrologyRepository.GetToolTypeByID(int id) => GetToolTypeByID(id); TransactionScope IMetrologyRepository.StartTransaction() =>
IEnumerable<ToolTypeMetadata> IMetrologyRepository.GetToolTypeMetadataByToolTypeID(int id) => GetToolTypeMetadataByToolTypeID(id); StartTransaction();
TransactionScope IMetrologyRepository.StartTransaction() => StartTransaction(); IEnumerable<ToolTypeMetadata> IMetrologyRepository.GetToolTypeMetadataByToolTypeID(int id) =>
void IMetrologyRepository.PurgeExistingData(int toolTypeId, string title) => PurgeExistingData(toolTypeId, title); GetToolTypeMetadataByToolTypeID(id);
long IMetrologyRepository.InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName) => InsertToolDataJSON(jsonbody, headerId, metaData, tableName);
DataTable IMetrologyRepository.ExportData(string spName, DateTime startTime, DateTime endTime) => ExportData(spName, startTime, endTime);
DataTable IMetrologyRepository.GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords) => GetHeaders(toolTypeId, startTime, endTime, pageNo, pageSize, headerid, out totalRecords);
DataTable IMetrologyRepository.GetData(int toolTypeId, long headerId) => GetData(toolTypeId, headerId);
HeaderCommon[] IMetrologyRepository.GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords) => GetHeaderTitles(toolTypeId, pageNo, pageSize, out totalRecords);
Guid IMetrologyRepository.GetHeaderAttachmentIDByTitle(int toolTypeId, string title) => GetHeaderAttachmentIDByTitle(toolTypeId, title);
Guid IMetrologyRepository.GetDataAttachmentIDByTitle(int toolTypeId, string title) => GetDataAttachmentIDByTitle(toolTypeId, title);
Guid IMetrologyRepository.GetHeaderAttachmentID(int toolTypeId, long headerId) => GetHeaderAttachmentID(toolTypeId, headerId);
string IMetrologyRepository.GetHeaderInsertDate(int toolTypeId, long headerId) => GetHeaderInsertDate(toolTypeId, headerId);
string IMetrologyRepository.GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId) => GetAttachmentInsertDateByGUID(tableName, attachmentId);
void IMetrologyRepository.SetHeaderDirName(string tableName, long headerId, string dateDir) => SetHeaderDirName(tableName, headerId, dateDir);
Guid IMetrologyRepository.GetDataAttachmentID(int toolTypeId, long headerId, string title) => GetDataAttachmentID(toolTypeId, headerId, title);
string IMetrologyRepository.GetDataInsertDate(int toolTypeId, long headerId, string title) => GetDataInsertDate(toolTypeId, headerId, title);
void IMetrologyRepository.SetDataDirName(string tableName, long headerId, string title, string dateDir) => SetDataDirName(tableName, headerId, title, dateDir);
DataSet IMetrologyRepository.GetOIExportData(int toolTypeId, long headerid) => GetOIExportData(toolTypeId, headerid);
IEnumerable<KeyValuePair<string, string>> IMetrologyRepository.GetHeaderFields(int toolTypeId, long headerid) => GetHeaderFields(toolTypeId, headerid);
IEnumerable<AwaitingDisposition> IMetrologyRepository.GetAwaitingDisposition() => GetAwaitingDisposition();
int IMetrologyRepository.UpdateReviewDate(int toolTypeId, long headerId, bool clearDate) => UpdateReviewDate(toolTypeId, headerId, clearDate);
} }

View File

@ -3,7 +3,6 @@ using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Services; using OI.Metrology.Shared.Services;
using System.Data; using System.Data;
using System.Text;
using System.Text.Json; using System.Text.Json;
namespace OI.Metrology.Server.Repository; namespace OI.Metrology.Server.Repository;
@ -237,96 +236,4 @@ public class ToolTypesRepository : IToolTypesRepository
return result; return result;
} }
Result<DataTable> IToolTypesRepository.GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
{
Result<DataTable>? r;
if (!string.IsNullOrEmpty(_MockRoot))
{
string json = File.ReadAllText(Path.Combine(string.Concat(AppContext.BaseDirectory, _MockRoot), $"{_RepositoryName}-{nameof(IToolTypesRepository.GetExportData)}.json"));
r = Newtonsoft.Json.JsonConvert.DeserializeObject<Result<DataTable>>(json);
if (r is null)
throw new NullReferenceException(nameof(r));
}
else
{
DateTime dateEnd = dateend is null ? DateTime.Now : DateTime.Parse(dateend);
DateTime dateBegin = datebegin is null ? dateEnd.AddMonths(-1) : DateTime.Parse(datebegin);
ToolType tt = metrologyRepository.GetToolTypeByID(toolTypeId);
if (string.IsNullOrEmpty(tt.ExportSPName))
throw new NullReferenceException(nameof(tt.ExportSPName));
DataTable dataTable = metrologyRepository.ExportData(tt.ExportSPName, dateBegin, dateEnd);
r = new()
{
Results = dataTable,
TotalRows = dataTable.Rows.Count,
};
}
return r;
}
protected static string FormatForCSV(string v)
{
StringBuilder result = new(v.Length + 2);
bool doubleQuoted = false;
if (v.StartsWith(' ') || v.EndsWith(' ') || v.Contains(',') || v.Contains('"'))
{
_ = result.Append('"');
doubleQuoted = true;
}
foreach (char c in v)
{
_ = c switch
{
'\r' or '\n' => result.Append(' '),
'"' => result.Append("\"\""),
_ => result.Append(c),
};
}
if (doubleQuoted)
_ = result.Append('"');
return result.ToString();
}
protected static string GetColumnHeaders(DataTable dataTable)
{
StringBuilder result = new();
for (int i = 0; i < dataTable.Columns.Count; i++)
{
if (i > 0)
_ = result.Append(',');
_ = result.Append(FormatForCSV(dataTable.Columns[i].ColumnName.TrimEnd('_')));
}
return result.ToString();
}
protected static string GetRowData(DataRow dr)
{
StringBuilder result = new();
for (int i = 0; i < dr.Table.Columns.Count; i++)
{
if (i > 0)
_ = result.Append(',');
object v = dr[i];
if (v is not null && !Convert.IsDBNull(v))
_ = result.Append(FormatForCSV(string.Concat(Convert.ToString(v))));
}
return result.ToString();
}
byte[] IToolTypesRepository.GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend)
{
byte[] results;
Result<DataTable> result;
IToolTypesRepository repository = this;
result = repository.GetExportData(metrologyRepository, toolTypeId, datebegin, dateend);
if (result.Results is null)
throw new NullReferenceException(nameof(result.Results));
StringBuilder stringBuilder = new();
_ = stringBuilder.AppendLine(GetColumnHeaders(result.Results));
foreach (DataRow dr in result.Results.Rows)
_ = stringBuilder.AppendLine(GetRowData(dr));
results = Encoding.UTF8.GetBytes(stringBuilder.ToString());
return results;
}
} }

View File

@ -1,211 +0,0 @@
using OI.Metrology.Server.Models;
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Shared.Repositories;
using System.Globalization;
namespace OI.Metrology.Server.Repository;
public class WaferCounterRepository : IWaferCounterRepository
{
private record Record(int Check,
int Total,
string? SlotMap);
private readonly string _MockRoot;
private readonly string _RepositoryName;
private readonly AppSettings _AppSettings;
private readonly IHttpClientFactory _HttpClientFactory;
private readonly IDbConnectionFactory _DBConnectionFactory;
private readonly IFileShareRepository _FileShareRepository;
private readonly string _OpenInsightApplicationProgrammingInterface;
public WaferCounterRepository(AppSettings appSettings, IDbConnectionFactory dbConnectionFactory, IHttpClientFactory httpClientFactory, IFileShareRepository fileShareRepository)
{
_AppSettings = appSettings;
_MockRoot = appSettings.MockRoot;
_HttpClientFactory = httpClientFactory;
_DBConnectionFactory = dbConnectionFactory;
_FileShareRepository = fileShareRepository;
_RepositoryName = nameof(WaferCounterRepository)[..^10];
_OpenInsightApplicationProgrammingInterface = appSettings.OpenInsightApplicationProgrammingInterface;
}
private void MoveFile(string waferSizeDirectory, NginxFileSystemSortable nginxFileSystemSortable)
{
Calendar calendar = new CultureInfo("en-US").Calendar;
string from = Path.Combine(waferSizeDirectory, nginxFileSystemSortable.Name);
string weekOfYear = $"{nginxFileSystemSortable.DateTime:yyyy}_Week_{calendar.GetWeekOfYear(nginxFileSystemSortable.DateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday):00}";
string to = Path.Combine(waferSizeDirectory, "Archive", weekOfYear, nginxFileSystemSortable.Name);
_FileShareRepository.MoveFile(from, to);
}
private static Record GetRecord(string line1, string line2)
{
Record result;
string? waferMap = string.IsNullOrEmpty(line2) || line2.Length != 8 ? null : line2.Substring(1, 1);
int check = waferMap == "1" ? 1 : 0;
int total = int.Parse(line1[1..]);
// string wafers = Array.from(line2[2..]);
foreach (char item in line2[2..])
{
switch (item)
{
case '0':
check += 0;
waferMap += "0000";
break;
case '1':
check += 1;
waferMap += "0001";
break;
case '2':
check += 1;
waferMap += "0010";
break;
case '3':
check += 2;
waferMap += "0011";
break;
case '4':
check += 1;
waferMap += "0100";
break;
case '5':
check += 2;
waferMap += "0101";
break;
case '6':
check += 2;
waferMap += "0110";
break;
case '7':
check += 3;
waferMap += "0111";
break;
case '8':
check += 1;
waferMap += "1000";
break;
case '9':
check += 2;
waferMap += "1001";
break;
case 'A':
check += 2;
waferMap += "1010";
break;
case 'B':
check += 3;
waferMap += "1011";
break;
case 'C':
check += 2;
waferMap += "1100";
break;
case 'D':
check += 3;
waferMap += "1101";
break;
case 'E':
check += 3;
waferMap += "1110";
break;
case 'F':
check += 4;
waferMap += "1111";
break;
default:
break;
}
}
result = new(check, total, waferMap);
return result;
}
private Uri GetWaferSizeUri(string area, string waferSize) =>
_FileShareRepository.Append(new Uri(_AppSettings.EcMesaFileShareCharacterizationSi), "WaferCounter", area, waferSize);
private string GetWaferSizeDirectory(string area, string waferSize, bool destination) =>
destination ? Path.Combine(_AppSettings.WaferCounterDestinationDirectory, area, waferSize) : Path.Combine(_AppSettings.EcCharacterizationSi, "WaferCounter", area, waferSize);
string? IWaferCounterRepository.GetSlotMap(string line1, string line2) =>
GetRecord(line1, line2).SlotMap;
private List<NginxFileSystemSortable> GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri waferSizeUri, string waferSizeDirectory)
{
List<NginxFileSystemSortable> results = new();
DateTime dateTime = DateTime.Now;
long ticks = dateTime.AddSeconds(_AppSettings.WaferCounterTwoFileSecondsWait).Ticks;
for (int i = 0; i < int.MaxValue; i++)
{
results = _FileShareRepository.GetNginxFileSystemSortableCollection(httpClient, waferSizeUri, ".wc");
if (results.Count > 1 || DateTime.Now.Ticks > ticks)
break;
Thread.Sleep(250);
}
for (int i = 1; i < results.Count; i++)
MoveFile(waferSizeDirectory, results[i]);
return results;
}
private static WaferCounter GetLastQuantityAndSlotMapWithText(string waferSize, string text, HttpClient httpClient, NginxFileSystemSortable nginxFileSystemSortable)
{
WaferCounter result;
Task<string> value = httpClient.GetStringAsync(nginxFileSystemSortable.Uri);
value.Wait();
string[] lines = value.Result.Split("\r\n");
if (lines.Length <= 1)
throw new Exception("Incomplete file length!");
string[] segments = nginxFileSystemSortable.Name.Split('-');
Record record = GetRecord(lines[0], lines[1]);
string equipmentId = segments.Length <= 1 ? nginxFileSystemSortable.Name : segments[1].Split('.')[0];
if (string.IsNullOrEmpty(record.SlotMap) || record.SlotMap.Length != 25)
throw new Exception("Wrong length!");
if (record.Total != record.Check)
throw new Exception("Invalid!");
result = new(nginxFileSystemSortable.DateTime, nginxFileSystemSortable.DateTime.ToString("yyyy-MM-dd hh:mm tt"), $"WC{waferSize}{equipmentId}", text, record.Total, record.SlotMap);
return result;
}
WaferCounter IWaferCounterRepository.GetLastQuantityAndSlotMap(string area, string waferSize)
{
WaferCounter result;
Uri waferSizeUri = GetWaferSizeUri(area, waferSize);
HttpClient httpClient = _HttpClientFactory.CreateClient();
string waferSizeDirectory = GetWaferSizeDirectory(area, waferSize, destination: false);
List<NginxFileSystemSortable> nginxFileSystemSortableCollection = GetNginxFileSystemSortableCollection(httpClient, waferSizeUri, waferSizeDirectory);
if (nginxFileSystemSortableCollection.Count < 1)
throw new Exception("No files!");
string text = string.Empty;
result = GetLastQuantityAndSlotMapWithText(waferSize, text, httpClient, nginxFileSystemSortableCollection[0]);
return result;
}
private void Save(string waferSizeDestinationDirectory, string area, string waferSize, string text, NginxFileSystemSortable nginxFileSystemSortable, WaferCounter result) =>
_FileShareRepository.FileWrite(Path.Combine(waferSizeDestinationDirectory, $"{nginxFileSystemSortable.Name}.csv"), $"100,{waferSize},{area},{nginxFileSystemSortable.DateTime},{text},{result.Total:00},{result.SlotMap} ");
WaferCounter IWaferCounterRepository.GetLastQuantityAndSlotMapWithText(string area, string waferSize, string text)
{
WaferCounter result;
Uri waferSizeUri = GetWaferSizeUri(area, waferSize);
HttpClient httpClient = _HttpClientFactory.CreateClient();
string waferSizeDirectory = GetWaferSizeDirectory(area, waferSize, destination: false);
List<NginxFileSystemSortable> nginxFileSystemSortableCollection = GetNginxFileSystemSortableCollection(httpClient, waferSizeUri, waferSizeDirectory);
if (nginxFileSystemSortableCollection.Count < 1)
throw new Exception("No files!");
result = GetLastQuantityAndSlotMapWithText(waferSize, text, httpClient, nginxFileSystemSortableCollection[0]);
if (result is not null)
{
string waferSizeDestinationDirectory = _AppSettings.WaferCounterDestinationDirectory;
// string waferSizeDestinationDirectory = GetWaferSizeUri(area, waferSize, destination: true);
Save(waferSizeDestinationDirectory, area, waferSize, text, nginxFileSystemSortableCollection[0], result);
}
if (result is null)
throw new NullReferenceException(nameof(result));
return result;
}
}

View File

@ -39,7 +39,7 @@ public class AttachmentsService : IAttachmentsService
HttpClient httpClient = _HttpClientFactory.CreateClient(); HttpClient httpClient = _HttpClientFactory.CreateClient();
Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi); Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi);
int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename); Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, "MetrologyAttachments", $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename);
HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, uri); HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, uri);
if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK) if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception("File not found!"); throw new Exception("File not found!");
@ -77,63 +77,36 @@ public class AttachmentsService : IAttachmentsService
return GetAttachmentStream(tableName, attachmentId, filename); return GetAttachmentStream(tableName, attachmentId, filename);
} }
private void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, IFormFile uploadedFile) void IAttachmentsService.SaveAttachment(ToolType toolType, Attachment attachment)
{ {
if (toolType is null) if (toolType is null)
throw new Exception("Invalid tool type"); throw new Exception("Invalid tool type");
if (attachment.HeaderId is null)
using System.Transactions.TransactionScope trans = _MetrologyRepository.StartTransaction(); throw new NullReferenceException($"{nameof(attachment.HeaderId)}");
Guid attachmentId = Guid.Empty; if (attachment.AttachmentId is null)
DateTime insertDate = new(); throw new NullReferenceException($"{nameof(attachment.AttachmentId)}");
string? tableName = ""; if (attachment.DestinationFileName is null)
if (string.IsNullOrWhiteSpace(dataUniqueId)) throw new NullReferenceException($"{nameof(attachment.DestinationFileName)}");
{ if (string.IsNullOrWhiteSpace(attachment.UniqueId))
attachmentId = _MetrologyRepository.GetHeaderAttachmentID(toolType.ID, headerId); throw new NullReferenceException($"{nameof(attachment.UniqueId)}");
insertDate = Convert.ToDateTime(_MetrologyRepository.GetHeaderInsertDate(toolType.ID, headerId)); if (attachment.DestinationFileName != "Image.pdf")
tableName = toolType.HeaderTableName; _MetrologyRepository.SetHeaderAttachmentID(toolType.ID, attachment.HeaderId.Value, attachment.AttachmentId);
}
else else
{ _MetrologyRepository.SetDataAttachmentID(toolType.ID, attachment.HeaderId.Value, attachment.UniqueId, attachment.AttachmentId);
attachmentId = _MetrologyRepository.GetDataAttachmentID(toolType.ID, headerId, dataUniqueId);
insertDate = Convert.ToDateTime(_MetrologyRepository.GetDataInsertDate(toolType.ID, headerId, dataUniqueId));
// Get Date for new directory name
tableName = toolType.DataTableName;
}
if (Equals(attachmentId, Guid.Empty))
{
trans.Dispose();
throw new Exception("Invalid attachment ID!");
}
string year = insertDate.Year.ToString();
HttpClient httpClient = _HttpClientFactory.CreateClient();
Uri mesaFileShareMetrologySi = new(_AppSettings.EcMesaFileShareMetrologySi);
int weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(insertDate, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
Uri uri = _FileShareRepository.Append(mesaFileShareMetrologySi, $"{tableName}_", year, $"WW{weekNum:00}", attachmentId.ToString(), filename);
HttpResponseMessage httpResponseMessage = _FileShareRepository.ReadFile(httpClient, uri);
if (httpResponseMessage.StatusCode != System.Net.HttpStatusCode.OK)
{
trans.Dispose();
throw new Exception("Invalid attachment path!");
}
uploadedFile.CopyTo(httpResponseMessage.Content.ReadAsStream());
trans.Complete();
}
void IAttachmentsService.SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, object uploadedFile)
{
IFormFile formFile = (IFormFile)uploadedFile;
SaveAttachment(toolType, headerId, dataUniqueId, filename, formFile);
} }
string? IAttachmentsService.GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId) string? IAttachmentsService.GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId)
{ {
string? result; string? result;
int weekNum; int weekNum;
string file;
string year; string year;
string directory;
Task<string> json; Task<string> json;
Uri weekDirectory; Uri weekDirectory;
Uri checkDirectory; Uri checkDirectory;
List<string> files = new(); List<string> files = new();
string[] collection = ["-", string.Empty];
NginxFileSystem[]? nginxFileSystemCollection; NginxFileSystem[]? nginxFileSystemCollection;
Task<HttpResponseMessage> httpResponseMessage; Task<HttpResponseMessage> httpResponseMessage;
HttpClient httpClient = _HttpClientFactory.CreateClient(); HttpClient httpClient = _HttpClientFactory.CreateClient();
@ -142,21 +115,32 @@ public class AttachmentsService : IAttachmentsService
ToolType toolType = metrologyRepository.GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID"); ToolType toolType = metrologyRepository.GetToolTypeByID(toolTypeId) ?? throw new Exception("Invalid tool type ID");
foreach (DateTime dateTime in dateTimes) foreach (DateTime dateTime in dateTimes)
{ {
year = dateTime.Year.ToString(); foreach (string item in collection)
weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday); {
weekDirectory = _FileShareRepository.Append(mesaFileShareMetrologySi, $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}"); year = dateTime.Year.ToString();
checkDirectory = _FileShareRepository.Append(weekDirectory, headerId.ToString()); weekNum = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday);
httpResponseMessage = httpClient.GetAsync(checkDirectory); weekDirectory = _FileShareRepository.Append(mesaFileShareMetrologySi, "MetrologyAttachments", $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}");
httpResponseMessage.Wait(); checkDirectory = _FileShareRepository.Append(weekDirectory, $"{item}{headerId}");
if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK) directory = Path.Combine(_AppSettings.EcMetrologySi, "MetrologyAttachments", $"{toolType.HeaderTableName}_", year, $"WW{weekNum:00}", $"{item}{headerId}");
continue; httpResponseMessage = httpClient.GetAsync(checkDirectory);
json = httpResponseMessage.Result.Content.ReadAsStringAsync(); httpResponseMessage.Wait();
json.Wait(); if (httpResponseMessage.Result.StatusCode != System.Net.HttpStatusCode.OK)
nginxFileSystemCollection = JsonSerializer.Deserialize(json.Result, NginxFileSystemCollectionSourceGenerationContext.Default.NginxFileSystemArray); continue;
if (nginxFileSystemCollection is null) json = httpResponseMessage.Result.Content.ReadAsStringAsync();
continue; json.Wait();
foreach (NginxFileSystem nginxFileSystem in nginxFileSystemCollection) nginxFileSystemCollection = JsonSerializer.Deserialize(json.Result, NginxFileSystemCollectionSourceGenerationContext.Default.NginxFileSystemArray);
files.Add(_FileShareRepository.Append(checkDirectory, nginxFileSystem.Name).AbsoluteUri); if (nginxFileSystemCollection is null)
continue;
foreach (NginxFileSystem nginxFileSystem in nginxFileSystemCollection)
{
if (!nginxFileSystem.Name.EndsWith(".pdsf"))
continue;
file = Path.Combine(directory, nginxFileSystem.Name);
files.Add(file);
}
if (files.Count != 0)
break;
}
if (files.Count != 0) if (files.Count != 0)
break; break;
} }

View File

@ -1,96 +0,0 @@
@using OI.Metrology.Shared.ViewModels
@model OI.Metrology.Shared.ViewModels.Export
@{
ViewData["Title"] = "Export Data";
}
<style>
td {
padding-bottom: 2em;
padding-right: 1em;
}
</style>
<h3>Export Data</h3>
<hr />
<form asp-controller="Export" asp-action="ExportData" method="post" class="form-inline">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType" name="ToolType"></div>
@Html.ValidationMessage("ToolType", new { @class = "text-danger" })
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDateControl"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTimeControl"></div>
@Html.ValidationMessage("StartDate", new { @class = "text-danger" })
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDateControl"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTimeControl"></div>
@Html.ValidationMessage("EndDate", new { @class = "text-danger" })
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Export Data</button>
</div>
<div class="form-group">
@Html.ValidationMessage("Exception", new { @class = "text-danger" })
</div>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</form>
<script>
$(document).ready(function () {
var apiUrl = "@ViewBag.ApiUrl";
$("#ToolType").igCombo({
dataSource: apiUrl + '/tooltypes',
responseDataKey: "Results",
textKey: "ToolTypeName",
valueKey: "ID",
mode: "dropdown",
width: 150
});
var startTime = new Date("@Model.StartTime.ToString("yyyy-MM-ddTHH:mm")");
$("#StartDateControl").igDatePicker({
dateInputFormat: "date",
value: startTime,
width: 125,
inputName: "StartDate",
});
$("#StartTimeControl").igTimePicker({
dateInputFormat: "time",
value: startTime,
width: 110,
inputName: "StartTime",
});
var endTime = new Date("@Model.EndTime.ToString("yyyy-MM-ddTHH:mm")");
$("#EndDateControl").igDatePicker({
dateInputFormat: "date",
value: endTime,
width: 125,
inputName: "EndDate",
});
$("#EndTimeControl").igTimePicker({
dateInputFormat: "time",
value: endTime,
width: 110,
inputName: "EndTime",
});
});
</script>

View File

@ -1,28 +0,0 @@
@{
ViewData["Title"] = "Awaiting Disposition";
}
<h4>Awaiting Disposition</h4>
<div style="height: 450px;">
<table id="grid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" id="OpenButton" value="Open" />
</div>
<div class="col-xs-1">
<input type="button" id="RefreshButton" value="Refresh" />
</div>
</div>
<script>
$(document).ready(function () {
initAwaitingDisposition("@ViewBag.ApiUrl");
});
</script>

View File

@ -1,3 +0,0 @@
@{
ViewData["Title"] = "Metrology Home Page";
}

View File

@ -1,57 +0,0 @@
@{
ViewData["Title"] = "Run Headers";
}
<style>
html,
body {
height: 100%;
}
div.container-fluid {
height: 90%;
}
#HeaderGrid,
#FieldsGrid {
font-size: 12px;
}
.FieldTitle {
font-weight: bold;
}
</style>
<h4>Run Headers</h4>
<table>
<tr>
<td>
<label for="ToolType">Tool Type:</label>
</td>
<td>
<div id="ToolType"></div>
</td>
</tr>
</table>
<table width="100%" height="80%">
<tr>
<td width="50%">
<table id="HeaderGrid"></table>
</td>
<td width="50%">
<table id="FieldsGrid"></table>
</td>
</tr>
</table>
<script>
$(document).ready(function () {
initRunHeaders("@ViewBag.ApiUrl");
});
</script>

View File

@ -1,104 +0,0 @@
@model OI.Metrology.Shared.ViewModels.RunInfo
@{
ViewData["Title"] = "Run Information";
}
<style>
#HeaderGridDiv,
#DetailsGridDiv {
font-size: 12px;
}
</style>
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;" hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<script>
$(document).ready(function () {
initRunInfo("@ViewBag.ApiUrl", "@Model.ToolTypeID", "@Model.HeaderID", "@Model.HeaderAttachmentID");
});
</script>

View File

@ -103,6 +103,6 @@
$("#runDataSheet5").click(function () { runDataSheet(5, $(this).val()) }); $("#runDataSheet5").click(function () { runDataSheet(5, $(this).val()) });
$("#runDataSheet6").click(function () { runDataSheet(6, $(this).val()) }); $("#runDataSheet6").click(function () { runDataSheet(6, $(this).val()) });
$("#restartButton").click(function () { restartButton() }); $("#restartButton").click(function () { restartButton() });
initWorkMaterial("@ViewBag.ApiUrl"); initWorkMaterial("@ViewBag.ApiUrl", "");
}); });
</script> </script>

View File

@ -6,36 +6,42 @@
<meta name="viewport" content="width=device-width" /> <meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title</title> <title>@ViewBag.Title</title>
<script src="~/js/modernizr-3.6.0-custom.js" type="text/javascript" asp-append-version="true"></script> <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<link href="~/styles/bootstrap.min.css" rel="stylesheet" asp-append-version="true" /> <link href="https://oi-metrology-viewer-prod.mes.infineon.com/styles/bootstrap.min.css?no-cache=2024-06-18-10-54"
<link href="~/igniteui/css/themes/bootstrap3/default/infragistics.theme.css" rel="stylesheet" rel="stylesheet" />
asp-append-version="true" /> <link
<link href="~/igniteui/css/structure/infragistics.css" rel="stylesheet" asp-append-version="true" /> href="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
<link href="~/styles/site.css" rel="stylesheet" asp-append-version="true" /> rel="stylesheet" />
<link
href="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="https://oi-metrology-viewer-prod.mes.infineon.com/styles/site-server.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="https://oi-metrology-viewer-prod.mes.infineon.com/styles/index.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<script src="~/js/jquery-3.6.0.min.js" type="text/javascript" asp-append-version="true"></script> <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54"
<script src="~/js/jquery-ui.min.js" type="text/javascript" asp-append-version="true"></script> type="text/javascript"></script>
<script src="~/igniteui/js/infragistics.core.js" type="text/javascript" asp-append-version="true"></script> <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/jquery-ui.min.js?no-cache=2024-06-18-10-54"
<script src="~/igniteui/js/infragistics.lob.js" type="text/javascript" asp-append-version="true"></script> type="text/javascript"></script>
<script src="~/igniteui/js/infragistics.dv.js" type="text/javascript" asp-append-version="true"></script> <script
src="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script
src="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script
src="https://oi-metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script src="~/js/chart-4.3.0.min.js" type="module"></script> <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/chart-4.3.0.min.js" type="module"></script>
<script src="~/js/common.js" type="text/javascript" asp-append-version="true"></script> <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/common.js?no-cache=2024-06-18-10-54"
<script src="~/js/site.js" type="text/javascript" asp-append-version="true"></script> type="text/javascript"></script>
<script> <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/site-server.js?no-cache=2024-06-18-10-54"
$(document).ready(function () { type="text/javascript"></script>
if (location.pathname == "/") {
route = "/AwaitingDispo";
}
else {
route = location.pathname;
}
$('ul.nav.navbar-nav').find('a[href="' + route + '"]')
.closest('li').addClass('alert-info');
});
</script>
</head> </head>
<body> <body>
@ -57,7 +63,9 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<div class="navbar-brand"> <div class="navbar-brand">
<a href="/"><img src="~/images/IFX_LOGO_RGB.png" height="20" /></a> <a href="https://oi-metrology-viewer-prod.mes.infineon.com"><img
src="https://oi-metrology-viewer-prod.mes.infineon.com/images/IFX_LOGO_RGB.png"
height="20" /></a>
OI Metrology Viewer OI Metrology Viewer
</div> </div>
</div> </div>
@ -91,8 +99,10 @@
<div id="MessageModal"></div> <div id="MessageModal"></div>
<script src="~/js/bootstrap.min.js" type="text/javascript" asp-append-version="true"></script> <script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/bootstrap.min.js?no-cache=2024-06-18-10-54"
<script src="~/js/respond.min.js" type="text/javascript" asp-append-version="true"></script> type="text/javascript"></script>
<script src="https://oi-metrology-viewer-prod.mes.infineon.com/js/respond.min.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
@RenderSection("scripts", required: false) @RenderSection("scripts", required: false)
</body> </body>

183
Server/wwwroot/index.html Normal file
View File

@ -0,0 +1,183 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="https://metrology-viewer-prod.mes.infineon.com/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<link href="https://metrology-viewer-prod.mes.infineon.com/styles/bootstrap.min.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link
href="https://metrology-viewer-prod.mes.infineon.com/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link
href="https://metrology-viewer-prod.mes.infineon.com/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="https://metrology-viewer-prod.mes.infineon.com/styles/site-server.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="https://metrology-viewer-prod.mes.infineon.com/styles/index.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<script src="https://metrology-viewer-prod.mes.infineon.com/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script src="https://metrology-viewer-prod.mes.infineon.com/js/jquery-ui.min.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script
src="https://metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script
src="https://metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script
src="https://metrology-viewer-prod.mes.infineon.com/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script src="https://metrology-viewer-prod.mes.infineon.com/js/chart-4.3.0.min.js" type="module"></script>
<script src="https://metrology-viewer-prod.mes.infineon.com/js/common.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script src="https://metrology-viewer-prod.mes.infineon.com/js/site-server.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="https://metrology-viewer-prod.mes.infineon.com"><img
src="https://metrology-viewer-prod.mes.infineon.com/images/IFX_LOGO_RGB.png"
height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="https://metrology-viewer-prod.mes.infineon.com/awaiting-disposition.html">Awaiting
Disposition</a></li>
<li><a href="https://metrology-viewer-prod.mes.infineon.com/index.html" class="alert-info">Run
Information</a></li>
<li><a href="https://metrology-viewer-prod.mes.infineon.com/run-headers.html">Run Headers</a></li>
<li><a href="https://oi-metrology-viewer-prod.mes.infineon.com/Export" target="_blank">Export</a>
</li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="https://metrology-viewer-prod.mes.infineon.com/js/bootstrap.min.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script src="https://metrology-viewer-prod.mes.infineon.com/js/respond.min.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
<script src="https://metrology-viewer-prod.mes.infineon.com/js/index.js?no-cache=2024-06-18-10-54"
type="text/javascript"></script>
</body>
</html>

View File

@ -3,6 +3,13 @@ namespace OI.Metrology.Shared.DataModels;
public record WaferCounter(DateTime DateTime, public record WaferCounter(DateTime DateTime,
string DateTimeFormatted, string DateTimeFormatted,
string EquipmentId, string EquipmentId,
string Message,
string Text, string Text,
int Total, int Total,
string SlotMap); string SlotMap)
{
public static WaferCounter GetWaferCounter(string message) =>
new(DateTime.MinValue, string.Empty, string.Empty, message, string.Empty, 0, string.Empty);
}

View File

@ -0,0 +1,17 @@
using System.Text.Json.Serialization;
namespace OI.Metrology.Shared.Models;
public record Attachment(string? SubGroupId,
long? HeaderId,
string? HeaderIdDirectory,
string? UniqueId,
string? DestinationFileName,
string? SourceFileName,
string? AttachmentId);
[JsonSourceGenerationOptions(WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
[JsonSerializable(typeof(Attachment))]
public partial class AttachmentSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -0,0 +1,5 @@
namespace OI.Metrology.Shared.Models;
public record CharacterizationInfo(string? Lot,
DateTime LastWriteTime,
string[] Lines);

View File

@ -0,0 +1,16 @@
using System.Text.Json.Serialization;
namespace OI.Metrology.Shared.Models;
public record CharacterizationParameters([property: JsonPropertyName("area")] string? Area,
[property: JsonPropertyName("equipment-id")] string? EquipmentId,
[property: JsonPropertyName("search-pattern")] string? SearchPattern,
[property: JsonPropertyName("start-time")] string? StartTime,
[property: JsonPropertyName("end-time")] string? EndTime,
[property: JsonPropertyName("wafer-size")] string? WaferSize);
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(CharacterizationParameters))]
public partial class CharacterizationParametersSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -8,7 +8,7 @@ public record Cleans(
// [property: JsonPropertyName("cleanTools")] object[] cleanTools // [property: JsonPropertyName("cleanTools")] object[] cleanTools
); );
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
[JsonSerializable(typeof(Cleans))] [JsonSerializable(typeof(Cleans))]
public partial class CleansSourceGenerationContext : JsonSerializerContext public partial class CleansSourceGenerationContext : JsonSerializerContext
{ {

View File

@ -11,7 +11,7 @@ public record Inspection(
// [property: JsonPropertyName("backSide")] BackSide BackSide // [property: JsonPropertyName("backSide")] BackSide BackSide
); );
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
[JsonSerializable(typeof(Inspection))] [JsonSerializable(typeof(Inspection))]
public partial class InspectionSourceGenerationContext : JsonSerializerContext public partial class InspectionSourceGenerationContext : JsonSerializerContext
{ {

View File

@ -19,7 +19,7 @@ public record ProdSpec(
[property: JsonPropertyName("prsStages")] PrsStage[] PrsStages [property: JsonPropertyName("prsStages")] PrsStage[] PrsStages
); );
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
[JsonSerializable(typeof(ProdSpec))] [JsonSerializable(typeof(ProdSpec))]
public partial class ProdSpecSourceGenerationContext : JsonSerializerContext public partial class ProdSpecSourceGenerationContext : JsonSerializerContext
{ {

View File

@ -8,7 +8,7 @@ public record ProdSpecRoot(
// [property: JsonPropertyName("_class")] string Class // [property: JsonPropertyName("_class")] string Class
); );
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
[JsonSerializable(typeof(ProdSpecRoot))] [JsonSerializable(typeof(ProdSpecRoot))]
public partial class ProdSpecRootSourceGenerationContext : JsonSerializerContext public partial class ProdSpecRootSourceGenerationContext : JsonSerializerContext
{ {

View File

@ -12,7 +12,7 @@ public record PrsStage(
[property: JsonPropertyName("qaMetTests")] QaMetTest[] QaMetTests [property: JsonPropertyName("qaMetTests")] QaMetTest[] QaMetTests
); );
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
[JsonSerializable(typeof(PrsStage))] [JsonSerializable(typeof(PrsStage))]
public partial class PrsStageSourceGenerationContext : JsonSerializerContext public partial class PrsStageSourceGenerationContext : JsonSerializerContext
{ {

View File

@ -20,7 +20,7 @@ public record QaMetTest(
[property: JsonPropertyName("sequence")] string Sequence [property: JsonPropertyName("sequence")] string Sequence
); );
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
[JsonSerializable(typeof(QaMetTest))] [JsonSerializable(typeof(QaMetTest))]
public partial class QaMetTestSourceGenerationContext : JsonSerializerContext public partial class QaMetTestSourceGenerationContext : JsonSerializerContext
{ {

View File

@ -14,5 +14,6 @@ public interface IAwaitingDispoController<T>
T Index(); T Index();
T MarkAsReviewed(long headerid, int tooltypeid); T MarkAsReviewed(long headerid, int tooltypeid);
T MarkAsAwaiting(long headerid, int tooltypeid); T MarkAsAwaiting(long headerid, int tooltypeid);
T GetHeaderAttachmentID(int toolTypeId, long headerid);
} }

View File

@ -1,4 +1,5 @@
using OI.Metrology.Shared.DataModels; using OI.Metrology.Shared.DataModels;
using System.Data;
namespace OI.Metrology.Shared.Models.Stateless; namespace OI.Metrology.Shared.Models.Stateless;
@ -9,5 +10,7 @@ public interface IExportRepository
Result<HeaderCommon[]> GetHeaders(HeaderCommon headerCommon); Result<HeaderCommon[]> GetHeaders(HeaderCommon headerCommon);
Result<HeaderCommon[]> GetLogistics(HeaderCommon headerCommon); Result<HeaderCommon[]> GetLogistics(HeaderCommon headerCommon);
string GetProcessDataStandardFormat(HeaderCommon headerCommon); string GetProcessDataStandardFormat(HeaderCommon headerCommon);
string GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend);
Result<DataTable> GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend);
} }

View File

@ -6,7 +6,9 @@ public interface IFileShareController<T>
enum Action : int enum Action : int
{ {
Index = 0, Index = 0,
MarkAsPinned = 1 CopyFile = 1,
MoveFile = 2,
FileWrite = 3,
} }
static string GetRouteName() => nameof(IFileShareController<T>)[1..^10]; static string GetRouteName() => nameof(IFileShareController<T>)[1..^10];

View File

@ -10,7 +10,6 @@ public interface IFileShareRepository
HttpResponseMessage ReadFile(HttpClient httpClient, Uri uri); HttpResponseMessage ReadFile(HttpClient httpClient, Uri uri);
void CopyFile(HttpClient httpClient, string from, string to); void CopyFile(HttpClient httpClient, string from, string to);
void MoveFile(HttpClient httpClient, string from, string to); void MoveFile(HttpClient httpClient, string from, string to);
void FileWrite(HttpClient httpClient, string path, string contents); List<CharacterizationInfo> GetArchiveData(CharacterizationParameters characterizationParameters);
List<NginxFileSystemSortable> GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith); List<NginxFileSystemSortable> GetNginxFileSystemSortableCollection(HttpClient httpClient, Uri uri, string? endsWith);
} }

View File

@ -1,3 +1,5 @@
using System.Text.Json;
namespace OI.Metrology.Shared.Models.Stateless; namespace OI.Metrology.Shared.Models.Stateless;
public interface IInboundController<T> public interface IInboundController<T>
@ -9,7 +11,7 @@ public interface IInboundController<T>
} }
static string GetRouteName() => nameof(IInboundController<T>)[1..^10]; static string GetRouteName() => nameof(IInboundController<T>)[1..^10];
T Post(string tooltype); T Post(string tooltype, JsonElement? jsonElement);
T AttachFile(string tooltype, long headerid, string datauniqueid = ""); T AttachFile(string tooltype, Attachment? attachment);
} }

View File

@ -1,5 +1,6 @@
using OI.Metrology.Shared.Services; using OI.Metrology.Shared.Services;
using System.Net; using System.Net;
using System.Text.Json;
namespace OI.Metrology.Shared.Models.Stateless; namespace OI.Metrology.Shared.Models.Stateless;
@ -7,7 +8,7 @@ public interface IInboundRepository
{ {
bool IsIPAddressAllowed(string inboundApiAllowedIPList, IPAddress? remoteIP); bool IsIPAddressAllowed(string inboundApiAllowedIPList, IPAddress? remoteIP);
DataResponse Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string tooltype, string? json); void AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string toolTypeName, Attachment? attachment);
string? AttachFile(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, string tooltype, long headerid, string datauniqueid, string fileName, object uploadedFile); DataResponse Data(IMetrologyRepository metrologyRepository, IInboundDataService inboundDataService, string toolTypeName, JsonElement? jsonElement);
} }

View File

@ -9,12 +9,15 @@ public interface IInfinityQSV4Controller<T>
MarkAsPinned = 1 MarkAsPinned = 1
} }
static string GetRouteName() => nameof(IInfinityQSV4Controller<T>)[1..^10]; static string GetRouteName() => nameof(IInfinityQSV4Controller<T>)[1..^12];
static string GetRouteVersion() => nameof(IInfinityQSV4Controller<T>)[1..^10][^2..];
T GetData(string sub_group_id); T GetData(string sub_group_id);
T GetHeader(string sub_group_id); T GetHeader(string sub_group_id);
T GetDescriptors(string sub_group_id); T GetDescriptors(string sub_group_id);
T GetEpiProTempVerification(int[] night); T GetEpiProTempVerification(int[] night);
T GetEpiProTempVerificationRows(int[] night); T GetEpiProTempVerificationRows(int[] night);
T GetLastGroupIdWithValue(string process, string? part, int? test);
T GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe); T GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe);
T GetCommandText(string sub_group_id, string process, string job, string part, string lot, string date_time); T GetCommandText(string sub_group_id, string process, string job, string part, string lot, string date_time);

View File

@ -17,7 +17,7 @@ public interface IInfinityQSV4Repository
string GetCommandText(List<string> eppReactorNumbers); string GetCommandText(List<string> eppReactorNumbers);
List<string[]> GetEpiProTempVerificationRows(int[] night); List<string[]> GetEpiProTempVerificationRows(int[] night);
Result<InfinityQSDescriptorV4[]> GetDescriptors(string subGroupId); Result<InfinityQSDescriptorV4[]> GetDescriptors(string subGroupId);
Dictionary<string, List<string>> GetEngineeringSpcReview(); string GetLastGroupIdWithValue(string process, string? part, int? test);
string GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe); string GetProductDataAverageSumOfDefectsProcessMeanProcessSigma(string process, string? recipe);
string GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime); string GetCommandText(string? subGroupId, string? process, string? job, string? part, string? lot, string? dateTime);

View File

@ -8,42 +8,30 @@ namespace OI.Metrology.Shared.Models.Stateless;
public interface IMetrologyRepository public interface IMetrologyRepository
{ {
ToolType GetToolTypeByID(int id);
TransactionScope StartTransaction();
IEnumerable<ToolType> GetToolTypes(); IEnumerable<ToolType> GetToolTypes();
ToolType GetToolTypeByName(string name); ToolType GetToolTypeByName(string name);
ToolType GetToolTypeByID(int id);
IEnumerable<ToolTypeMetadata> GetToolTypeMetadataByToolTypeID(int id);
TransactionScope StartTransaction();
void PurgeExistingData(int toolTypeId, string title);
long InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName);
DataTable ExportData(string spName, DateTime startTime, DateTime endTime);
DataTable GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords);
DataTable GetData(int toolTypeId, long headerId); DataTable GetData(int toolTypeId, long headerId);
DataTable GetDataSharePoint(int toolTypeId, string headerId); void PurgeExistingData(int toolTypeId, string title);
HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords);
Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title);
Guid GetDataAttachmentIDByTitle(int toolTypeId, string title);
Guid GetHeaderAttachmentID(int toolTypeId, long headerId);
string GetHeaderInsertDate(int toolTypeId, long headerId);
string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId);
void SetHeaderDirName(string tableName, long headerId, string dateDir);
Guid GetDataAttachmentID(int toolTypeId, long headerId, string title);
string GetDataInsertDate(int toolTypeId, long headerId, string title);
void SetDataDirName(string tableName, long headerId, string title, string dateDir);
DataSet GetOIExportData(int toolTypeId, long headerid); DataSet GetOIExportData(int toolTypeId, long headerid);
Guid GetHeaderAttachmentID(int toolTypeId, long headerId);
IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid);
IEnumerable<AwaitingDisposition> GetAwaitingDisposition(); IEnumerable<AwaitingDisposition> GetAwaitingDisposition();
string GetHeaderInsertDate(int toolTypeId, long headerId);
Guid GetDataAttachmentIDByTitle(int toolTypeId, string title);
Guid GetHeaderAttachmentIDByTitle(int toolTypeId, string title);
int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate); int UpdateReviewDate(int toolTypeId, long headerId, bool clearDate);
IEnumerable<ToolTypeMetadata> GetToolTypeMetadataByToolTypeID(int id);
string GetDataInsertDate(int toolTypeId, long headerId, string title);
void SetHeaderDirName(string tableName, long headerId, string dateDir);
DataTable ExportData(string spName, DateTime startTime, DateTime endTime);
string GetAttachmentInsertDateByGUID(string tableName, Guid attachmentId);
void SetHeaderAttachmentID(int toolTypeId, long headerId, string attachmentId);
void SetDataDirName(string tableName, long headerId, string title, string dateDir);
IEnumerable<KeyValuePair<string, string>> GetHeaderFields(int toolTypeId, long headerid);
void SetDataAttachmentID(int toolTypeId, long headerId, string title, string attachmentId);
HeaderCommon[] GetHeaderTitles(int? toolTypeId, int? pageNo, int? pageSize, out long totalRecords);
long InsertToolDataJSON(JToken jsonbody, long headerId, List<ToolTypeMetadata> metaData, string tableName);
DataTable GetHeaders(int toolTypeId, string? startTime, string? endTime, int? pageNo, int? pageSize, long? headerid, out long totalRecords);
} }

View File

@ -10,10 +10,8 @@ public interface IToolTypesRepository
Result<ToolTypeNameId[]> Index(IMetrologyRepository metrologyRepository); Result<ToolTypeNameId[]> Index(IMetrologyRepository metrologyRepository);
Result<DataTable> GetData(IMetrologyRepository metrologyRepository, int id, long headerid); Result<DataTable> GetData(IMetrologyRepository metrologyRepository, int id, long headerid);
Result<ColumnValue[]> GetHeaderFields(IMetrologyRepository metrologyRepository, int id, long headerid); Result<ColumnValue[]> GetHeaderFields(IMetrologyRepository metrologyRepository, int id, long headerid);
byte[] GetCSVExport(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend);
Result<HeaderCommon[]> GetHeaderTitles(IMetrologyRepository metrologyRepository, int id, int? page, int? pagesize); Result<HeaderCommon[]> GetHeaderTitles(IMetrologyRepository metrologyRepository, int id, int? page, int? pagesize);
Result<ToolTypeMetadataResult> GetToolTypeMetadata(IMetrologyRepository metrologyRepository, int id, string sortby = ""); Result<ToolTypeMetadataResult> GetToolTypeMetadata(IMetrologyRepository metrologyRepository, int id, string sortby = "");
Result<DataTable> GetExportData(IMetrologyRepository metrologyRepository, int toolTypeId, string? datebegin, string? dateend);
string? OIExport(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, long headerid); string? OIExport(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, long headerid);
Result<DataTable> GetHeaders(IMetrologyRepository metrologyRepository, int id, string? datebegin, string? dateend, int? page, int? pagesize, long? headerid); Result<DataTable> GetHeaders(IMetrologyRepository metrologyRepository, int id, string? datebegin, string? dateend, int? page, int? pagesize, long? headerid);
(string?, string?, Stream?) GetAttachment(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, string tabletype, string attachmentId, string filename); (string?, string?, Stream?) GetAttachment(IMetrologyRepository metrologyRepository, IAttachmentsService attachmentsService, int toolTypeId, string tabletype, string attachmentId, string filename);

View File

@ -11,7 +11,6 @@ public interface IWaferCounterController<T>
static string GetRouteName() => nameof(IWaferCounterController<T>)[1..^10]; static string GetRouteName() => nameof(IWaferCounterController<T>)[1..^10];
T GetLastQuantityAndSlotMap(string area, string waferSize); T GetLastQuantityAndSlotMap(string area, string waferSize, string text);
T GetLastQuantityAndSlotMapWithText(string area, string waferSize, string text);
} }

View File

@ -4,7 +4,6 @@ public interface IWaferCounterRepository
{ {
string? GetSlotMap(string line1, string line2); string? GetSlotMap(string line1, string line2);
DataModels.WaferCounter GetLastQuantityAndSlotMap(string area, string waferSize); DataModels.WaferCounter? GetLastQuantityAndSlotMap(string area, string waferSize, string text);
DataModels.WaferCounter? GetLastQuantityAndSlotMapWithText(string area, string waferSize, string text);
} }

View File

@ -7,7 +7,7 @@ public record Surfscan(
[property: JsonPropertyName("surfscanRecipes")] SurfscanRecipe[] SurfscanRecipes [property: JsonPropertyName("surfscanRecipes")] SurfscanRecipe[] SurfscanRecipes
); );
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
[JsonSerializable(typeof(Surfscan))] [JsonSerializable(typeof(Surfscan))]
public partial class SurfscanSourceGenerationContext : JsonSerializerContext public partial class SurfscanSourceGenerationContext : JsonSerializerContext
{ {

View File

@ -9,7 +9,7 @@ public record SurfscanRecipe(
[property: JsonPropertyName("sampleSize")] int? SampleSize [property: JsonPropertyName("sampleSize")] int? SampleSize
); );
[JsonSourceGenerationOptions(WriteIndented = true)] [JsonSourceGenerationOptions(WriteIndented = true, NumberHandling = JsonNumberHandling.AllowReadingFromString)]
[JsonSerializable(typeof(SurfscanRecipe))] [JsonSerializable(typeof(SurfscanRecipe))]
public partial class SurfscanRecipeSourceGenerationContext : JsonSerializerContext public partial class SurfscanRecipeSourceGenerationContext : JsonSerializerContext
{ {

View File

@ -1,6 +1,7 @@
namespace OI.Metrology.Shared.Services; namespace OI.Metrology.Shared.Services;
using DataModels; using DataModels;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless; using OI.Metrology.Shared.Models.Stateless;
public interface IAttachmentsService public interface IAttachmentsService
@ -8,5 +9,5 @@ public interface IAttachmentsService
Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename); Stream GetAttachmentStreamByTitle(ToolType toolType, bool header, string title, string filename);
Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename); Stream GetAttachmentStreamByAttachmentId(ToolType toolType, bool header, Guid attachmentId, string filename);
string? GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId); string? GetProcessDataStandardFormat(IMetrologyRepository metrologyRepository, int toolTypeId, long headerId);
void SaveAttachment(ToolType toolType, long headerId, string dataUniqueId, string filename, object uploadedFile); void SaveAttachment(ToolType toolType, Attachment attachment);
} }

5
Static/.vscode/mklink.md vendored Normal file
View File

@ -0,0 +1,5 @@
# mklink
```bash
mklink /J "D:\wwwRoot" "L:\DevOps\Mesa_FI\OI-Metrology\Static"
```

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

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

28
Static/.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,28 @@
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "MakeDirctory",
"command": "mkdir",
"args": [
"D:\\web-sites\\OI-Metrology\\pp-6737ddfb-_______-OI-Metrology-Release"
],
},
{
"type": "shell",
"label": "CopySite",
"command": "robocopy",
"args": [
"L:\\DevOps\\Mesa_FI\\OI-Metrology\\Static",
"D:\\web-sites\\OI-Metrology\\pp-6737ddfb-_______-OI-Metrology-Release\\Static",
"/E",
"/MT:6",
"/NFL",
"/NDL",
"/NJH",
"/NJS"
],
}
]
}

View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html" class="alert-info">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

161
Static/Export/index.html Normal file
View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html" class="alert-info">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html" class="alert-info">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html" class="alert-info">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html" class="alert-info">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html" class="alert-info">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

161
Static/Metrology/index.html Normal file
View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html" class="alert-info">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html" class="alert-info">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

161
Static/RunInfo/index.html Normal file
View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Run Information</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html" class="alert-info">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/index.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

View File

@ -0,0 +1,88 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Awaiting Disposition</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html" class="alert-info">Awaiting Disposition</a></li>
<li><a href="/index.html">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Awaiting Disposition</h4>
<div style="height: 450px;">
<table id="grid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" id="OpenButton" value="Open" />
</div>
<div class="col-xs-1">
<input type="button" id="RefreshButton" value="Refresh" />
</div>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/awaiting-disposition.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

96
Static/export.html Normal file
View File

@ -0,0 +1,96 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>Export Data</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/export.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html">Files</a></li>
<li><a href="/export.html" class="alert-info">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h3>Export Data</h3>
<hr />
<form class="form-inline">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType" name="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>
<div class="form-group">
<button type="button" id="ExportButton" class="btn btn-primary">Export Data</button>
</div>
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
</form>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/export.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/FileSaver.min.js" type="text/javascript"></script>
</body>
</html>

161
Static/files.html Normal file
View File

@ -0,0 +1,161 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width" />
<title>File(s)</title>
<script src="/js/modernizr-3.6.0-custom.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<link href="/styles/bootstrap.min.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/igniteui/css/themes/bootstrap3/default/infragistics.theme.css?no-cache=2024-06-18-10-54"
rel="stylesheet" />
<link href="/igniteui/css/structure/infragistics.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/site-server.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<link href="/styles/index.css?no-cache=2024-06-18-10-54" rel="stylesheet" />
<script src="/js/jquery-3.6.0.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/jquery-ui.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.core.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.lob.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/igniteui/js/infragistics.dv.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/chart-4.3.0.min.js" type="module"></script>
<script src="/js/common.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/site-server.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<div class="navbar-brand">
<a href="/"><img src="/images/IFX_LOGO_RGB.png" height="20" /></a>
OI Metrology Viewer
</div>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/awaiting-disposition.html">Awaiting Disposition</a></li>
<li><a href="/index.html">Run Information</a></li>
<li><a href="/run-headers.html">Run Headers</a></li>
<li><a href="/files.html" class="alert-info">Files</a></li>
<li><a href="/export.html">Export</a></li>
<li><a href="https://oi-metrology-viewer-archive.mes.infineon.com/" target="_blank">Archive</a></li>
<li><a href="https://goto.infineon.com/oiwizard" target="_blank">OI Web Services</a></li>
<li><a href="/mes.html" target="_blank">FI Backlog</a></li>
</ul>
<p class="navbar-text navbar-right">
&nbsp;
</p>
</div>
</div>
</div>
<div class="container-fluid body-content">
<h4>Run Information</h4>
<form class="form-inline mb-4">
<div class="form-group">
<label for="ToolType">Tool Type</label>
<div class="form-control" id="ToolType"></div>
</div>
<div class="form-group">
<label for="StartDate">Start Time</label>
<div class="form-control mb-2 mr-sm-2" id="StartDate"></div>
<div class="form-control mb-2 mr-sm-2" id="StartTime"></div>
</div>
<div class="form-group">
<label for="EndDate">End Time</label>
<div class="form-control mb-2 mr-sm-2" id="EndDate"></div>
<div class="form-control mb-2 mr-sm-2" id="EndTime"></div>
</div>&nbsp;&nbsp;
<div class="form-group">
<input class="btn btn-primary" type="button" value="Load Headers" id="LoadHeadersButton" />
</div>&nbsp;&nbsp;
<div class="form-group">
<label class="form-check-label" for="chkAutoRefresh">
Auto-Refresh
</label>
<input class="form-check-input" type="checkbox" id="chkAutoRefresh">
</div>
<div class="form-group">
<label class="form-check-label" for="chkCopyOnGet">
Copy-On-Get
</label>
<input class="form-check-input" type="checkbox" id="chkCopyOnGet">
</div>
</form>
<div style="height: 300px;" id="HeaderGridDiv">
<span id="ToolTypeID" hidden></span>
<table id="HeaderGrid"></table>
</div>
<div class="row" style="margin-top: 10px; margin-bottom: 20px;">
<div class="col-xs-1">
<input type="button" class="btn" id="GetDataButton" value="Get Data" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ReviewButton" value="Review" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="RecipeParametersButton" value="Parameters" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="ViewButton" value="View" disabled />
</div>
<div class="col-xs-1">
<input type="button" class="btn" id="PinButton" value="Pin" disabled />
</div>
</div>
<div id="DetailsDiv" hidden>
<span id="HeaderId" hidden></span>
<span id="HeaderAttachmentId" hidden></span>
<div style="padding-bottom: 20px;" id="DetailsGridDiv">
<table id="DetailsGrid"></table>
</div>
<div id="ExportDiv" style="margin-top: 10px;" hidden>
<input type="button" value="Send to OpenInsight" id="OIExportButton" />
<span id="OIExportResult" style="margin-left: 10px; font-weight: bold; color: #366b02;"></span>
</div>
<p style="margin-top: 20px;">
<iframe id="DataAttachmentFrame" style="height:900px; border-width:thin; margin-right: 10px;"
hidden></iframe>
<iframe id="HeaderAttachmentFrame" style="height:900px; border-width:thin;" hidden></iframe>
&nbsp;
<div id="DataAttachmentDiv" hidden>
<canvas id="DataAttachmentCanvas"></canvas>
</div>
<div id="HeaderAttachmentDiv" hidden>
<canvas id="HeaderAttachmentCanvas"></canvas>
</div>
</p>
</div>
<hr />
<footer>
<p>&copy; 2024 - Infineon Technologies</p>
</footer>
</div>
<div id="MessageModal"></div>
<script src="/js/bootstrap.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/respond.min.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
<script src="/js/files.js?no-cache=2024-06-18-10-54" type="text/javascript"></script>
</body>
</html>

View File

Before

Width:  |  Height:  |  Size: 272 KiB

After

Width:  |  Height:  |  Size: 272 KiB

View File

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 210 B

After

Width:  |  Height:  |  Size: 210 B

View File

Before

Width:  |  Height:  |  Size: 964 B

After

Width:  |  Height:  |  Size: 964 B

View File

Before

Width:  |  Height:  |  Size: 486 B

After

Width:  |  Height:  |  Size: 486 B

View File

Before

Width:  |  Height:  |  Size: 483 B

After

Width:  |  Height:  |  Size: 483 B

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 6.0 KiB

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

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