Compare commits

..

No commits in common. "release/1.0.0" and "master" have entirely different histories.

3 changed files with 34 additions and 79 deletions

View File

@ -1,13 +0,0 @@
# 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"]

View File

@ -1,5 +1,4 @@
using System; using System;
using System.IO;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using FellowOakDicom; using FellowOakDicom;
using FellowOakDicom.Network; using FellowOakDicom.Network;
@ -39,13 +38,12 @@ namespace DicomMigratorApp
_logger.LogInformation("Application started"); _logger.LogInformation("Application started");
connectionString = Environment.GetEnvironmentVariable("ConnectionStrings__DefaultConnection") connectionString = "Server=127.0.0.1;Port=3306;Database=dms_db;User Id=root;Password=Rootmatrix23@;";
?? "Server=127.0.0.1;Port=3306;Database=dms_db;User Id=root;Password=Rootmatrix23@;"; targetIP = "127.0.0.1";
targetIP = Environment.GetEnvironmentVariable("TARGET_IP") ?? "127.0.0.1"; senderAET = "MYAE";
senderAET = Environment.GetEnvironmentVariable("SENDER_AET") ?? "MYAE"; targetAET = "ORTHANC";
targetAET = Environment.GetEnvironmentVariable("TARGET_AET") ?? "ORTHANC"; folderLocation = "D:\\dicom_imags\\";
folderLocation = Environment.GetEnvironmentVariable("FOLDER_LOCATION") ?? "D:\\dicom_images\\"; var targetPortStr = "4242";
string targetPortStr = Environment.GetEnvironmentVariable("TARGET_PORT") ?? "4242";
if (!int.TryParse(targetPortStr, out targetPort)) if (!int.TryParse(targetPortStr, out targetPort))
{ {
@ -53,46 +51,37 @@ namespace DicomMigratorApp
return; return;
} }
while (true) try
{ {
var migrationStudy = await GetMigrationStudy(connectionString);
if (migrationStudy == null)
{
_logger.LogInformation("No studies found for migration.");
return;
}
_logger.LogInformation($"Retrieved studyDetails for Migration");
try try
{ {
var migrationStudy = await GetMigrationStudy(connectionString); await MigrateStudy(migrationStudy.StudyInstanceUID, folderLocation + migrationStudy.StudyInstanceUID);
if (migrationStudy == null) await UpdateSourceCFind(connectionString, migrationStudy.StudyInstanceUID, "MIGRATION_COMPLETE");
{ }
await Task.Delay(5000); catch (DicomAssociationRejectedException ex)
continue; {
} _logger.LogError(ex, $"Association rejected for studyInstanceUID {migrationStudy.StudyInstanceUID}");
await UpdateSourceCFind(connectionString, migrationStudy.StudyInstanceUID, "MIGRATION_ERRORED");
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) catch (Exception ex)
{ {
_logger.LogError(ex, "An error occurred in the main processing loop"); _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 in the main processing loop");
}
} }
private static async Task<SourceStudy> GetMigrationStudy(string connectionString) private static async Task<SourceStudy> GetMigrationStudy(string connectionString)
@ -103,8 +92,10 @@ namespace DicomMigratorApp
{ {
using (var connection = new MySqlConnection(connectionString)) using (var connection = new MySqlConnection(connectionString))
{ {
_logger.LogInformation("Opening a connection to the database");
await connection.OpenAsync(); await connection.OpenAsync();
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); _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 reader = await command.ExecuteReaderAsync(); var reader = await command.ExecuteReaderAsync();
while (await reader.ReadAsync()) while (await reader.ReadAsync())
@ -159,12 +150,11 @@ namespace DicomMigratorApp
} }
} }
private static async Task MigrateStudy(string studyInstanceUID, string folderPath, string targetIP, int targetPort, string senderAET, string targetAET) private static async Task MigrateStudy(string studyInstanceUID, string folderPath)
{ {
var client = DicomClientFactory.Create(targetIP, targetPort, false, senderAET, targetAET); var client = DicomClientFactory.Create(targetIP, targetPort, false, senderAET, targetAET);
// Gather all DICOM files in the directory and subdirectories var files = System.IO.Directory.GetFiles(folderPath, "*");
var files = Directory.GetFiles(folderPath, "*", SearchOption.AllDirectories);
foreach (var file in files) foreach (var file in files)
{ {
var dicomFile = await DicomFile.OpenAsync(file); var dicomFile = await DicomFile.OpenAsync(file);

View File

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