From a01234a56dbfb98a5ad4b53c47cac1956c8a4cb6 Mon Sep 17 00:00:00 2001 From: shadab ahmed Date: Fri, 26 Jul 2024 22:17:39 +0530 Subject: [PATCH] 1.0.0 version code --- Dockerfile | 13 ++++++++ Program.cs | 78 ++++++++++++++++++++++++++-------------------- docker-compose.yml | 22 +++++++++++++ 3 files changed, 79 insertions(+), 34 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..baa3d57 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +# Use the official .NET SDK image to build and publish the app +FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +WORKDIR /app + +# Copy everything and build +COPY . . +RUN dotnet publish -c Release -o out + +# Use the official .NET runtime image for a smaller container +FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime +WORKDIR /app +COPY --from=build /app/out ./ +ENTRYPOINT ["dotnet", "DicomMigratorApp.dll"] diff --git a/Program.cs b/Program.cs index c625fa2..d75b165 100644 --- a/Program.cs +++ b/Program.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using MySql.Data.MySqlClient; using FellowOakDicom; using FellowOakDicom.Network; @@ -38,12 +39,13 @@ namespace DicomMigratorApp _logger.LogInformation("Application started"); - connectionString = "Server=127.0.0.1;Port=3306;Database=dms_db;User Id=root;Password=Rootmatrix23@;"; - targetIP = "127.0.0.1"; - senderAET = "MYAE"; - targetAET = "ORTHANC"; - folderLocation = "D:\\dicom_imags\\"; - var targetPortStr = "4242"; + connectionString = Environment.GetEnvironmentVariable("ConnectionStrings__DefaultConnection") + ?? "Server=127.0.0.1;Port=3306;Database=dms_db;User Id=root;Password=Rootmatrix23@;"; + targetIP = Environment.GetEnvironmentVariable("TARGET_IP") ?? "127.0.0.1"; + senderAET = Environment.GetEnvironmentVariable("SENDER_AET") ?? "MYAE"; + targetAET = Environment.GetEnvironmentVariable("TARGET_AET") ?? "ORTHANC"; + folderLocation = Environment.GetEnvironmentVariable("FOLDER_LOCATION") ?? "D:\\dicom_images\\"; + string targetPortStr = Environment.GetEnvironmentVariable("TARGET_PORT") ?? "4242"; if (!int.TryParse(targetPortStr, out targetPort)) { @@ -51,37 +53,46 @@ namespace DicomMigratorApp return; } - try + while (true) { - var migrationStudy = await GetMigrationStudy(connectionString); - if (migrationStudy == null) - { - _logger.LogInformation("No studies found for migration."); - return; - } - - _logger.LogInformation($"Retrieved studyDetails for Migration"); - try { - await MigrateStudy(migrationStudy.StudyInstanceUID, folderLocation + migrationStudy.StudyInstanceUID); - await UpdateSourceCFind(connectionString, migrationStudy.StudyInstanceUID, "MIGRATION_COMPLETE"); - } - catch (DicomAssociationRejectedException ex) - { - _logger.LogError(ex, $"Association rejected for studyInstanceUID {migrationStudy.StudyInstanceUID}"); - await UpdateSourceCFind(connectionString, migrationStudy.StudyInstanceUID, "MIGRATION_ERRORED"); + var migrationStudy = await GetMigrationStudy(connectionString); + if (migrationStudy == null) + { + await Task.Delay(5000); + continue; + } + + try + { + var folderPath = Path.Combine(folderLocation, migrationStudy.StudyInstanceUID); + if (!Directory.Exists(folderPath)) + { + _logger.LogError($"Study folder not found for studyInstanceUID {migrationStudy.StudyInstanceUID}"); + await UpdateSourceCFind(connectionString, migrationStudy.StudyInstanceUID, "MIGRATION_SIUID_FOLDER_NOT_PRESENT"); + continue; + } + + await MigrateStudy(migrationStudy.StudyInstanceUID, folderPath, targetIP, targetPort, senderAET, targetAET); + await UpdateSourceCFind(connectionString, migrationStudy.StudyInstanceUID, "MIGRATION_COMPLETE"); + } + catch (DicomAssociationRejectedException ex) + { + _logger.LogError(ex, $"Association rejected for studyInstanceUID {migrationStudy.StudyInstanceUID}"); + await UpdateSourceCFind(connectionString, migrationStudy.StudyInstanceUID, "MIGRATION_ERRORED"); + } + catch (Exception ex) + { + _logger.LogError(ex, $"An error occurred while retrieving or saving studyInstanceUID {migrationStudy.StudyInstanceUID}"); + await UpdateSourceCFind(connectionString, migrationStudy.StudyInstanceUID, "MIGRATION_ERRORED"); + } } catch (Exception ex) { - _logger.LogError(ex, $"An error occurred while retrieving or saving studyInstanceUID {migrationStudy.StudyInstanceUID}"); - await UpdateSourceCFind(connectionString, migrationStudy.StudyInstanceUID, "MIGRATION_ERRORED"); + _logger.LogError(ex, "An error occurred in the main processing loop"); } } - catch (Exception ex) - { - _logger.LogError(ex, "An error occurred in the main processing loop"); - } } private static async Task GetMigrationStudy(string connectionString) @@ -92,10 +103,8 @@ namespace DicomMigratorApp { using (var connection = new MySqlConnection(connectionString)) { - _logger.LogInformation("Opening a connection to the database"); await connection.OpenAsync(); - _logger.LogInformation("Database connection established"); - var command = new MySqlCommand("SELECT study_instance_uid,patient_id,status FROM source_cfind WHERE status='QR_COMPLETE' LIMIT 1", connection); + var command = new MySqlCommand("SELECT study_instance_uid,patient_id,status FROM source_cfind WHERE status='QR_COMPLETE' and (schedule_date IS NOT NULL AND LEFT(schedule_date, 8) >= DATE_FORMAT(CURDATE(), '%Y%m%d')) LIMIT 1", connection); var reader = await command.ExecuteReaderAsync(); while (await reader.ReadAsync()) @@ -150,11 +159,12 @@ namespace DicomMigratorApp } } - private static async Task MigrateStudy(string studyInstanceUID, string folderPath) + private static async Task MigrateStudy(string studyInstanceUID, string folderPath, string targetIP, int targetPort, string senderAET, string targetAET) { var client = DicomClientFactory.Create(targetIP, targetPort, false, senderAET, targetAET); - var files = System.IO.Directory.GetFiles(folderPath, "*"); + // Gather all DICOM files in the directory and subdirectories + var files = Directory.GetFiles(folderPath, "*", SearchOption.AllDirectories); foreach (var file in files) { var dicomFile = await DicomFile.OpenAsync(file); diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..9bee797 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +version: '3.8' + +services: + dicommigratorautomated: + image: seyfertsoft/dicommigratorautomated:1.0.0 + container_name: dicommigratorautomated + environment: + - "ConnectionStrings__DefaultConnection=Server=mysqldb;Port=3306;Database=dms_db;User Id=root;Password=Rootmatrix23@;" + - TARGET_IP=127.0.0.1 + - SENDER_AET=MYAE + - TARGET_AET=ORTHANC + - "FOLDER_LOCATION=D:\\dicom_imags\\" + - TARGET_PORT=4242 + volumes: + - /path/to/images1:/app/images1 + - /path/to/images2:/app/images2 + networks: + - dmsnetwork + +networks: + dmsnetwork: + external: true