This commit is contained in:
Masroor Ehsan 2025-01-22 19:55:21 +06:00
parent adce481226
commit fd786881e9
4 changed files with 30 additions and 34 deletions

View File

@ -6,7 +6,6 @@
final class ContentMatcher final class ContentMatcher
{ {
public static function match(string $input, string $pattern, MatchMode $mode): bool public static function match(string $input, string $pattern, MatchMode $mode): bool
{ {
if (blank($input) || blank($pattern)) { if (blank($input) || blank($pattern)) {
@ -22,6 +21,7 @@ public static function match(string $input, string $pattern, MatchMode $mode): b
MatchMode::Regex => preg_match($pattern, $input) === 1, MatchMode::Regex => preg_match($pattern, $input) === 1,
}; };
} }
private static function matchList(string $input, string $pattern): bool private static function matchList(string $input, string $pattern): bool
{ {
$patterns = collect(explode(',', $pattern)) $patterns = collect(explode(',', $pattern))

View File

@ -106,23 +106,28 @@ public function fetchStudyDetails(string $orthanc_uuid): ?array
return $study; return $study;
} }
public function matchOrganization(mixed $orthanc_src) public function matchRouting(mixed $orthanc_src)
{ {
$dicomData = [ $dicomData = [
DicomTagIdentifiers::PatientName->value => data_get($orthanc_src, 'PatientMainDicomTags.PatientName'), DicomTagIdentifiers::PatientName->value => data_get($orthanc_src, 'PatientMainDicomTags.PatientName'),
DicomTagIdentifiers::PatientID->value => data_get($orthanc_src, 'PatientMainDicomTags.PatientID'), DicomTagIdentifiers::PatientID->value => data_get($orthanc_src, 'PatientMainDicomTags.PatientID'),
DicomTagIdentifiers::Modality->value => data_get($orthanc_src, 'RequestedTags.Modality'), DicomTagIdentifiers::Modality->value => data_get($orthanc_src, 'RequestedTags.Modality'),
DicomTagIdentifiers::StudyDescription->value => $this->getStudyDescription($orthanc_src),
DicomTagIdentifiers::BodyPartExamined->value => data_get($orthanc_src, 'RequestedTags.BodyPartExamined'), DicomTagIdentifiers::BodyPartExamined->value => data_get($orthanc_src, 'RequestedTags.BodyPartExamined'),
DicomTagIdentifiers::ReferringPhysicianName->value => data_get($orthanc_src, 'MainDicomTags.ReferringPhysicianName'),
DicomTagIdentifiers::AccessionNumber->value => data_get($orthanc_src, 'MainDicomTags.AccessionNumber'),
DicomTagIdentifiers::InstitutionName->value => data_get($orthanc_src, 'MainDicomTags.InstitutionName'), DicomTagIdentifiers::InstitutionName->value => data_get($orthanc_src, 'MainDicomTags.InstitutionName'),
DicomTagIdentifiers::InstitutionAddress->value => data_get($orthanc_src, 'RequestedTags.InstitutionAddress'), DicomTagIdentifiers::InstitutionAddress->value => data_get($orthanc_src, 'RequestedTags.InstitutionAddress'),
DicomTagIdentifiers::StudyDescription->value => $this->getStudyDescription($orthanc_src), DicomTagIdentifiers::OperatorsName->value => data_get($orthanc_src, 'RequestedTags.OperatorsName'),
DicomTagIdentifiers::OperatorsName->value => data_get($orthanc_src, 'MainDicomTags.InstitutionName'), DicomTagIdentifiers::StationName->value => data_get($orthanc_src, 'RequestedTags.StationName'),
DicomTagIdentifiers::StationName->value => data_get($orthanc_src, 'MainDicomTags.InstitutionName'), DicomTagIdentifiers::Manufacturer->value => data_get($orthanc_src, 'RequestedTags.Manufacturer'),
DicomTagIdentifiers::ReferringPhysicianName->value => data_get($orthanc_src, 'MainDicomTags.InstitutionName'), DicomTagIdentifiers::ManufacturerModelName->value => data_get($orthanc_src, 'RequestedTags.ManufacturerModelName'),
DicomTagIdentifiers::Manufacturer->value => data_get($orthanc_src, 'MainDicomTags.InstitutionName'), DicomTagIdentifiers::SoftwareVersions->value => data_get($orthanc_src, 'RequestedTags.SoftwareVersions'),
DicomTagIdentifiers::SoftwareVersions->value => data_get($orthanc_src, 'MainDicomTags.InstitutionName'), DicomTagIdentifiers::ProtocolName->value => data_get($orthanc_src, 'xxx'),
DicomTagIdentifiers::ProtocolName->value => data_get($orthanc_src, 'MainDicomTags.InstitutionName'),
]; ];
$dicomData = array_purge($dicomData);
return DicomStudyRouter::matchStudy($dicomData);
} }
public function getStudyDescription(mixed $orthanc_src): ?string public function getStudyDescription(mixed $orthanc_src): ?string
@ -143,7 +148,7 @@ public function getStudyDescription(mixed $orthanc_src): ?string
public function transformData(mixed $orthanc_src): array public function transformData(mixed $orthanc_src): array
{ {
$inst_name = data_get($orthanc_src, 'MainDicomTags.InstitutionName'); $inst_name = data_get($orthanc_src, 'MainDicomTags.InstitutionName');
$inst_id = DicomStudyRouter::matchStudy($inst_name); $routing = $this->matchRouting($orthanc_src);
$patient_name = data_get($orthanc_src, 'PatientMainDicomTags.PatientName'); $patient_name = data_get($orthanc_src, 'PatientMainDicomTags.PatientName');
@ -152,7 +157,8 @@ public function transformData(mixed $orthanc_src): array
'dicom_server_id' => $this->dicomServer->id, 'dicom_server_id' => $this->dicomServer->id,
'orthanc_uuid' => strtolower($orthanc_src['ID']), 'orthanc_uuid' => strtolower($orthanc_src['ID']),
'institution_name' => $inst_name, 'institution_name' => $inst_name,
'institute_id' => $inst_id, 'organization_id' => $routing['institute_id'],
'department_id' => $routing['department_id'],
'patient_uuid' => strtolower($orthanc_src['ParentPatient']), 'patient_uuid' => strtolower($orthanc_src['ParentPatient']),
'patient_id' => data_get($orthanc_src, 'PatientMainDicomTags.PatientID'), 'patient_id' => data_get($orthanc_src, 'PatientMainDicomTags.PatientID'),
@ -174,7 +180,7 @@ public function transformData(mixed $orthanc_src): array
'series_count' => data_get($orthanc_src, 'Statistics.CountSeries'), 'series_count' => data_get($orthanc_src, 'Statistics.CountSeries'),
'disk_size' => data_get($orthanc_src, 'Statistics.DiskSize'), 'disk_size' => data_get($orthanc_src, 'Statistics.DiskSize'),
'study_description' =>$descr, 'study_description' => $descr,
]; ];
if ((bool) data_get($orthanc_src, 'IsStable', false)) { if ((bool) data_get($orthanc_src, 'IsStable', false)) {

View File

@ -10,6 +10,7 @@
use App\Models\DicomRuleCondition; use App\Models\DicomRuleCondition;
use App\Models\Organization; use App\Models\Organization;
use App\Models\User; use App\Models\User;
use App\Services\ContentMatcher;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
@ -26,7 +27,7 @@ public static function matchStudy(array $dicomHeaders): array
self::initialize(); self::initialize();
if (blank($dicomHeaders)) { if (blank($dicomHeaders)) {
return self::fallbackRoute(); return self::fallbackRouting();
} }
foreach (self::$rules as $rule) { foreach (self::$rules as $rule) {
@ -38,22 +39,22 @@ public static function matchStudy(array $dicomHeaders): array
if ($matches) { if ($matches) {
return [ return [
'institute_id' => $rule->institute_id, 'organization_id' => $rule->organization_id,
'facility_id' => $rule->facility_id, 'department_id' => $rule->department_id,
'rule_id' => $rule->id, 'rule_id' => $rule->id,
'radiologists' => self::getRadiologists($rule), 'radiologists' => self::getRadiologists($rule),
]; ];
} }
} }
return self::fallbackRoute(); return self::fallbackRouting();
} }
private static function fallbackRoute(): array private static function fallbackRouting(): array
{ {
return [ return [
'institute_id' => self::$catchAll, 'organization_id' => self::$catchAll,
'facility_id' => null, 'department_id' => null,
'rule_id' => null, 'rule_id' => null,
'radiologists' => null, 'radiologists' => null,
]; ];
@ -101,23 +102,12 @@ private static function matchCondition(DicomRuleCondition $condition, array $dic
} }
} }
switch ($matchMode) { return ContentMatcher::match($dicomValue, $searchPattern, $matchMode);
case MatchMode::Exact:
return $dicomValue === $searchPattern;
case MatchMode::StartsWith:
return str_starts_with($dicomValue, $searchPattern);
case MatchMode::EndsWith:
return str_ends_with($dicomValue, $searchPattern);
case MatchMode::Contains:
return str_contains($dicomValue, $searchPattern);
case MatchMode::Regex:
return preg_match($searchPattern, $dicomValue) === 1;
}
} }
private static function getRadiologists(DicomRoutingRule $rule): array private static function getRadiologists(DicomRoutingRule $rule): array
{ {
if ($rule->assignment_panel_id) { if (!is_null($rule->assignment_panel_id)) {
$panel = AssignmentPanel::active() $panel = AssignmentPanel::active()
->with('radiologists:id') ->with('radiologists:id')
->find($rule->assignment_panel_id); ->find($rule->assignment_panel_id);
@ -128,7 +118,7 @@ private static function getRadiologists(DicomRoutingRule $rule): array
return array_intersect($rads, self::$activeRads->toArray()); return array_intersect($rads, self::$activeRads->toArray());
} }
} }
} elseif ($rule->radiologist_id) { } elseif (!is_null($rule->radiologist_id)) {
if (self::$activeRads->contains($rule->radiologist_id)) { if (self::$activeRads->contains($rule->radiologist_id)) {
return [$rule->radiologist_id]; return [$rule->radiologist_id];
} }

View File

@ -8,7 +8,7 @@
], ],
"license": "MIT", "license": "MIT",
"require": { "require": {
"php": ">=8.3", "php": ">=8.4",
"barryvdh/laravel-dompdf": "^3.0", "barryvdh/laravel-dompdf": "^3.0",
"culturegr/presenter": "^1.4", "culturegr/presenter": "^1.4",
"filament/filament": "^3.2", "filament/filament": "^3.2",