From 5b5a976c401249aeb2a74934efbe8d109698f523 Mon Sep 17 00:00:00 2001 From: anonym-HPI <68286419+anonym-HPI@users.noreply.github.com> Date: Thu, 6 Oct 2022 22:07:42 +0200 Subject: [PATCH] new capacity model proposal --- .../data/default-state/material-templates.ts | 4 +- .../data/default-state/personnel-templates.ts | 10 ++--- shared/src/models/utils/cater-for.ts | 43 +++---------------- .../utils/calculate-treatments.ts | 42 +++++++----------- 4 files changed, 28 insertions(+), 71 deletions(-) diff --git a/shared/src/data/default-state/material-templates.ts b/shared/src/data/default-state/material-templates.ts index d5647bd04..9ebedf74c 100644 --- a/shared/src/data/default-state/material-templates.ts +++ b/shared/src/data/default-state/material-templates.ts @@ -13,7 +13,7 @@ const standardMaterialTemplate = MaterialTemplate.create( height: 40, aspectRatio: 1, }, - CanCaterFor.create(2, 0, 0, 'and'), + CanCaterFor.create(2), defaultOverrideTreatmentRange, defaultTreatmentRange ); @@ -26,7 +26,7 @@ const bigMaterialTemplate = MaterialTemplate.create( height: 56, aspectRatio: 1, }, - CanCaterFor.create(2, 2, 0, 'and'), + CanCaterFor.create(4), defaultOverrideTreatmentRange, 10 ); diff --git a/shared/src/data/default-state/personnel-templates.ts b/shared/src/data/default-state/personnel-templates.ts index 19701065d..7863d04b2 100644 --- a/shared/src/data/default-state/personnel-templates.ts +++ b/shared/src/data/default-state/personnel-templates.ts @@ -13,7 +13,7 @@ const sanPersonnelTemplate = PersonnelTemplate.create( height: 80, aspectRatio: 1, }, - CanCaterFor.create(0, 0, 5, 'and'), + CanCaterFor.create(0.3), defaultOverrideTreatmentRange, defaultTreatmentRange ); @@ -25,7 +25,7 @@ const rettSanPersonnelTemplate = PersonnelTemplate.create( height: 80, aspectRatio: 1, }, - CanCaterFor.create(1, 2, 0, 'and'), + CanCaterFor.create(0.8), defaultOverrideTreatmentRange, defaultTreatmentRange ); @@ -37,7 +37,7 @@ const notSanPersonnelTemplate = PersonnelTemplate.create( height: 80, aspectRatio: 1, }, - CanCaterFor.create(2, 1, 0, 'and'), + CanCaterFor.create(1), defaultOverrideTreatmentRange, defaultTreatmentRange ); @@ -49,7 +49,7 @@ const notarztPersonnelTemplate = PersonnelTemplate.create( height: 80, aspectRatio: 1, }, - CanCaterFor.create(2, 2, 2, 'and'), + CanCaterFor.create(1.2), defaultOverrideTreatmentRange, 15 ); @@ -61,7 +61,7 @@ const gfPersonnelTemplate = PersonnelTemplate.create( height: 80, aspectRatio: 1, }, - CanCaterFor.create(0, 0, 0, 'and'), + CanCaterFor.create(0), 0, 0 ); diff --git a/shared/src/models/utils/cater-for.ts b/shared/src/models/utils/cater-for.ts index 1ec5b0892..5e50da001 100644 --- a/shared/src/models/utils/cater-for.ts +++ b/shared/src/models/utils/cater-for.ts @@ -1,52 +1,19 @@ -import { IsNumber, IsString, Min } from 'class-validator'; +import { IsNumber, Min } from 'class-validator'; import { getCreate } from './get-create'; export class CanCaterFor { /** - * if {@link logicalOperator} `=== 'and'` it is cumulative, - * how many red patients can the catering treat - * also affects the number of possible {@link yellow} and {@link green} patients - * that can be treated. + * */ @IsNumber() @Min(0) - public readonly red: number; - - /** - * if {@link logicalOperator} `=== 'and'` it is cumulative, - * how many extra {@link yellow} and {@link green} patients can the catering treat - * to the number already written in the {@link red} value - */ - @IsNumber() - @Min(0) - public readonly yellow: number; - - /** - * if {@link logicalOperator} `=== 'and'` it is cumulative, - * how many {@link green} patients can the catering treat - * to the number already written in the {@link yellow} and {@link red} value - */ - @IsNumber() - @Min(0) - public readonly green: number; - - // TODO: Use a better validator - @IsString() - public readonly logicalOperator: 'and' | 'or'; + public readonly capacity: number; /** * @deprecated Use {@link create} instead */ - constructor( - red: number, - yellow: number, - green: number, - logicalOperator: 'and' | 'or' - ) { - this.red = red; - this.yellow = yellow; - this.green = green; - this.logicalOperator = logicalOperator; + constructor(capacity: number) { + this.capacity = capacity; } static readonly create = getCreate(this); diff --git a/shared/src/store/action-reducers/utils/calculate-treatments.ts b/shared/src/store/action-reducers/utils/calculate-treatments.ts index fbc9fd9d7..40651c8c4 100644 --- a/shared/src/store/action-reducers/utils/calculate-treatments.ts +++ b/shared/src/store/action-reducers/utils/calculate-treatments.ts @@ -19,6 +19,12 @@ interface CatersFor { green: number; } +const catersCost = { + red: 1, + yellow: 0.6, + green: 0.3, +}; + /** * @returns whether a material or personnel could treat a patient with {@link status} if it already {@link catersFor} patients */ @@ -31,33 +37,19 @@ function couldCaterFor( if (status === 'black' || status === 'blue') { return false; } - if (cateringElement.canCaterFor.logicalOperator === 'or') { - const numberOfTreatedCategories = Object.entries(catersFor).filter( - ([category, catersForInCategory]) => - // Will be treated - status === category || - // Is already treated - catersForInCategory > 0 - ).length; - return ( - // Only one category can be treated - numberOfTreatedCategories <= 1 && - // + 1 for the patient that will be treated - catersFor[status] + 1 <= cateringElement.canCaterFor[status] - ); - } - let availableCapacity = 0; + let cateredCapacity = 0; for (const category of ['red', 'yellow', 'green'] as const) { // The catering capacity is calculated cumulatively - a red slot can also treat a yellow or green one instead - availableCapacity += - cateringElement.canCaterFor[category] - - catersFor[category] - - (status === category ? 1 : 0); - if (availableCapacity < 0) { - return false; - } + cateredCapacity += catersFor[category] * catersCost[category]; } + if ( + cateredCapacity + catersCost[status] > + cateringElement.canCaterFor.capacity + ) { + return false; + } + return true; } @@ -240,9 +232,7 @@ function updateCatering( // Doing this behind removeTreatmentsOfElement to catch the case someone changed via export import // the canCaterFor to 0 while an Element is treating something in the exported state if ( - (cateringElement.canCaterFor.red === 0 && - cateringElement.canCaterFor.yellow === 0 && - cateringElement.canCaterFor.green === 0) || + cateringElement.canCaterFor.capacity === 0 || // The element is no longer in a position to treat a patient cateringElement.position === undefined ) {