wip rules engine
This commit is contained in:
parent
21b24fe542
commit
ce9669b556
@ -3,16 +3,13 @@
|
|||||||
namespace App\Services\StudyRouter;
|
namespace App\Services\StudyRouter;
|
||||||
|
|
||||||
use App\Domain\ACL\Role;
|
use App\Domain\ACL\Role;
|
||||||
use App\Domain\Rule\MatchCondition;
|
|
||||||
use App\Domain\Rule\MatchMode;
|
|
||||||
use App\Models\AssignmentPanel;
|
use App\Models\AssignmentPanel;
|
||||||
use App\Models\DicomRoutingRule;
|
use App\Models\DicomRoutingRule;
|
||||||
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;
|
||||||
|
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
|
||||||
|
|
||||||
final class DicomStudyRouter
|
final class DicomStudyRouter
|
||||||
{
|
{
|
||||||
@ -30,22 +27,16 @@ public static function matchStudy(array $dicomHeaders): array
|
|||||||
return self::fallbackRouting();
|
return self::fallbackRouting();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$expression = new ExpressionLanguage;
|
||||||
foreach (self::$rules as $rule) {
|
foreach (self::$rules as $rule) {
|
||||||
$conditions = $rule->conditions()->orderByDesc('priority')->get();
|
$matches = (bool) $expression->evaluate($rule->condition, ['study' => $dicomHeaders]);
|
||||||
$matches = $rule->match_condition === MatchCondition::ALL
|
|
||||||
? $conditions->every(fn ($condition) => self::matchCondition($condition, $dicomHeaders))
|
|
||||||
: $conditions->contains(fn ($condition) => self::matchCondition($condition, $dicomHeaders));
|
|
||||||
|
|
||||||
/*
|
|
||||||
if ($dicomHeaders[RawDicomTags::Modality->value] === 'CR') {
|
|
||||||
dd($rule, $conditions->toArray(), $matches, $dicomHeaders[RawDicomTags::Modality->value]);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
if ($matches) {
|
if ($matches) {
|
||||||
return [
|
return [
|
||||||
'organization_id' => $rule->organization_id,
|
'organization_id' => $rule->organization_id,
|
||||||
'department_id' => $rule->department_id,
|
'department_id' => $rule->department_id,
|
||||||
'rule_id' => $rule->id,
|
'rule_id' => $rule->id,
|
||||||
|
'rule_name' => $rule->name,
|
||||||
'radiologists' => self::getRadiologists($rule),
|
'radiologists' => self::getRadiologists($rule),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -70,7 +61,6 @@ private static function initialize(): void
|
|||||||
self::$rules = Cache::remember('dicom.rules',
|
self::$rules = Cache::remember('dicom.rules',
|
||||||
now()->addMinutes(self::CACHE_TTL),
|
now()->addMinutes(self::CACHE_TTL),
|
||||||
fn () => DicomRoutingRule::active()
|
fn () => DicomRoutingRule::active()
|
||||||
->with('conditions')
|
|
||||||
->orderByDesc('priority')
|
->orderByDesc('priority')
|
||||||
->get()
|
->get()
|
||||||
);
|
);
|
||||||
@ -92,22 +82,6 @@ private static function initialize(): void
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function matchCondition(DicomRuleCondition $condition, array $dicomHeaders): bool
|
|
||||||
{
|
|
||||||
$dicomTag = $condition->dicom_tag;
|
|
||||||
$dicomValue = $dicomHeaders[$dicomTag] ?? '';
|
|
||||||
$searchPattern = $condition->search_pattern;
|
|
||||||
|
|
||||||
if (! $condition->case_sensitive) {
|
|
||||||
$dicomValue = strtolower($dicomValue);
|
|
||||||
if ($condition->match_mode !== MatchMode::Regex) {
|
|
||||||
$searchPattern = strtolower($searchPattern);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ContentMatcher::match($dicomValue, $searchPattern, $condition->match_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static function getRadiologists(DicomRoutingRule $rule): array
|
private static function getRadiologists(DicomRoutingRule $rule): array
|
||||||
{
|
{
|
||||||
if (! is_null($rule->assignment_panel_id)) {
|
if (! is_null($rule->assignment_panel_id)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user