3737import tools .jackson .databind .node .ObjectNode ;
3838
3939import java .time .Month ;
40+ import java .time .YearMonth ;
4041import java .util .Comparator ;
4142import java .util .HashMap ;
4243import java .util .HashSet ;
4344import java .util .List ;
4445import java .util .Map ;
46+ import java .util .Objects ;
4547import java .util .Set ;
46- import java .util .concurrent . atomic . AtomicReference ;
48+ import java .util .StringJoiner ;
4749import java .util .function .Function ;
4850import java .util .stream .Collectors ;
4951
@@ -98,8 +100,7 @@ public Flux<DashboardTeamsDTO> getTeamsStatus() {
98100 .flatMapMany (teams -> bestillingRepository .findBestillingerForTeamsOrderBySistOppdatert ()
99101 .groupBy (TeamFragment ::getInterval )
100102 .flatMap (Flux ::collectList )
101- .flatMap (fragments -> Mono .just (
102- Tuples .of (groupFragmentsByTeam (fragments , teams ), fragments .getFirst ().getInterval ()))))
103+ .map (fragments -> Tuples .of (groupFragmentsByTeam (fragments , teams ), fragments .getFirst ().getInterval ())))
103104 .map (tuple ->
104105 DashboardTeamsDTO .builder ()
105106 .interval (tuple .getT2 ())
@@ -125,8 +126,7 @@ public Flux<DashboardOrganisasjonerDTO> getOrganisasjonerStatus() {
125126 .flatMapMany (oppslag -> bestillingRepository .findBestillingerForOrganisasjonerOrderBySistOppdatert ()
126127 .groupBy (OrganisasjonFragment ::getInterval )
127128 .flatMap (Flux ::collectList )
128- .flatMap (fragments -> Mono .just (
129- Tuples .of (groupFragmentsByOrganisasjon (fragments , oppslag .getT2 ()), fragments .getFirst ().getInterval ())))
129+ .map (fragments -> Tuples .of (groupFragmentsByOrganisasjon (fragments , oppslag .getT2 ()), fragments .getFirst ().getInterval ()))
130130 .map (tuple -> DashboardOrganisasjonerDTO .builder ()
131131 .interval (tuple .getT2 ())
132132 .organisasjoner (tuple .getT1 ().entrySet ().stream ()
@@ -194,7 +194,9 @@ private static Map<String, Set<String>> groupFragmentsByOrganisasjon(List<Organi
194194 var grouped = new HashMap <String , Set <String >>();
195195 fragments .forEach (fragment -> {
196196 var orgNummer = brukerToOrgnummer .get (fragment .getBrukerid ());
197- grouped .computeIfAbsent (orgNummer , _ -> new HashSet <>()).add (fragment .getBrukerid ());
197+ if (Objects .nonNull (orgNummer )) {
198+ grouped .computeIfAbsent (orgNummer , _ -> new HashSet <>()).add (fragment .getBrukerid ());
199+ }
198200 });
199201 return grouped ;
200202 }
@@ -220,18 +222,12 @@ private static DashboardDollyTeamsDTO.Entry toDollyTeamEntry(DollyTeamFragment f
220222 public Flux <JsonNode > getFeilstatusSummert (int year , Month month ) {
221223
222224 var filter = "%4d-%02d" .formatted (year , month .getValue ());
223- return bestillingProgressRepository .findStatusColumns ()
224- .reduce (new StringBuilder (), (StringBuilder sb , String column ) ->
225- sb .append (" or lower(bp." )
226- .append (column )
227- .append (") like '%feil%'" ))
228- .map (kolonner -> "select b.sist_oppdatert::date bestilling_dato, bp.* " +
229- "from bestilling b " +
230- "join bestilling_progress bp on bp.bestilling_id = b.id " +
231- "where to_char(b.sist_oppdatert, 'YYYY-MM') = :range " +
232- "and (" +
233- kolonner .substring (4 ) +
234- ") order by bestilling_dato" )
225+ return buildFeilWhereFragment ()
226+ .map (feilFilter -> "select b.sist_oppdatert::date bestilling_dato, bp.* " +
227+ "from bestilling b " +
228+ "join bestilling_progress bp on bp.bestilling_id = b.id " +
229+ "where to_char(b.sist_oppdatert, 'YYYY-MM') = :range " +
230+ "and (" + feilFilter + ") order by bestilling_dato" )
235231 .flatMapMany (query -> entityTemplate .getDatabaseClient ()
236232 .sql (query )
237233 .bind ("range" , filter )
@@ -246,18 +242,12 @@ public Flux<JsonNode> getFeilstatusSummert(int year, Month month) {
246242 public Flux <JsonNode > getFeilstatusDetaljert (int year , Month month , int day ) {
247243
248244 var filter = "%4d-%02d-%02d" .formatted (year , month .getValue (), day );
249- return bestillingProgressRepository .findStatusColumns ()
250- .reduce (new StringBuilder (), (StringBuilder sb , String column ) ->
251- sb .append (" or lower(bp." )
252- .append (column )
253- .append (") like '%feil%'" ))
254- .map (kolonner -> "select b.sist_oppdatert, bp.* " +
255- "from bestilling b " +
256- "join bestilling_progress bp on bp.bestilling_id = b.id " +
257- "where to_char(b.sist_oppdatert, 'YYYY-MM-DD') = :range " +
258- "and (" +
259- kolonner .substring (4 ) +
260- ") order by b.sist_oppdatert" )
245+ return buildFeilWhereFragment ()
246+ .map (feilFilter -> "select b.sist_oppdatert, bp.* " +
247+ "from bestilling b " +
248+ "join bestilling_progress bp on bp.bestilling_id = b.id " +
249+ "where to_char(b.sist_oppdatert, 'YYYY-MM-DD') = :range " +
250+ "and (" + feilFilter + ") order by b.sist_oppdatert" )
261251 .flatMapMany (query -> entityTemplate .getDatabaseClient ()
262252 .sql (query )
263253 .bind ("range" , filter )
@@ -268,42 +258,43 @@ public Flux<JsonNode> getFeilstatusDetaljert(int year, Month month, int day) {
268258 .flatMap (this ::tilFeilJson );
269259 }
270260
261+ private Mono <String > buildFeilWhereFragment () {
262+ return bestillingProgressRepository .findStatusColumns ()
263+ .reduce (new StringJoiner (" or " ), (joiner , column ) ->
264+ joiner .add ("lower(bp." + column + ") like '%feil%'" ))
265+ .map (StringJoiner ::toString );
266+ }
267+
271268 private Mono <JsonNode > tilFeilstatusSummert (List <BestillingProgressDTO > bestillingProgressDTOS ) {
272269
273- var resultat = new AtomicReference <>( new HashMap <>() );
270+ Map < String , Object > resultat = new HashMap <>();
274271 bestillingProgressDTOS .forEach (progress -> {
275272 var kilde = (ObjectNode ) jsonMapper .valueToTree (progress );
276273
277274 for (var navn : kilde .propertyNames ()) {
278275 var verdi = kilde .get (navn );
279276 if (!IDENTITETSFELT .contains (navn )) {
280277 if ("bestillingDato" .equals (navn )) {
281- resultat .get (). putIfAbsent (navn , verdi );
278+ resultat .putIfAbsent (navn , verdi );
282279 } else if (verdi .isString () && verdi .asString ().toLowerCase ().contains ("feil" )) {
283- if (resultat .get ().containsKey (navn )) {
284- var teller = (Integer ) resultat .get ().get (navn );
285- resultat .get ().put (navn , teller + 1 );
286- } else {
287- resultat .get ().put (navn , 1 );
288- }
280+ resultat .merge (navn , 1 , (existing , _ ) -> (Integer ) existing + 1 );
289281 }
290282 }
291283 }
292284 });
293- return Flux . fromIterable ( resultat .get ().entrySet () )
285+ var summert = resultat .entrySet ().stream ( )
294286 .collect (Collectors .toMap (entry -> {
295- if ((( String ) entry .getKey ()). contains ( "Status" )) {
296- return (( String ) entry . getKey ())
297- .replace ("Status" , "Feil" );
298- } else if (entry . getKey (). equals ( "feil" )) {
287+ var key = entry .getKey ();
288+ if ( key . contains ( "Status" )) {
289+ return key .replace ("Status" , "Feil" );
290+ } else if ("feil" . equals ( key )) {
299291 return "andreFeil" ;
300292 } else {
301- return entry . getKey () ;
293+ return key ;
302294 }
303- }
304- , Map .Entry ::getValue ))
305- .flatMap (summert -> summert .isEmpty () ? Mono .empty () :
306- Mono .just (jsonMapper .valueToTree (summert )));
295+ },
296+ Map .Entry ::getValue ));
297+ return summert .isEmpty () ? Mono .empty () : Mono .just (jsonMapper .valueToTree (summert ));
307298 }
308299
309300 private Mono <JsonNode > tilFeilJson (BestillingProgressDTO progress ) {
@@ -380,25 +371,29 @@ public Flux<DashboardOversiktDTO> getPerioderOversikt() {
380371 return bestillingRepository .findByAvailIntervals ()
381372 .groupBy (OversiktFragment ::getMaaned )
382373 .flatMap (Flux ::collectList )
383- .map (fragmenter -> DashboardOversiktDTO .builder ()
384- .aarManed (fragmenter .getFirst ().getMaaned ())
385- .aar (Integer .parseInt (fragmenter .getFirst ().getMaaned ().substring (0 , 4 )))
386- .maaned (Month .of (Integer .parseInt (fragmenter .getFirst ().getMaaned ().substring (5 ))))
387- .totaltAntallPersoner (fragmenter .stream ()
388- .map (OversiktFragment ::getAntall )
389- .mapToInt (Long ::intValue )
390- .sum ())
391- .nye (fragmenter .stream ()
392- .filter (fragment -> "NYBESTILLING" .equals (fragment .getGjenopprettstatus ()))
393- .map (OversiktFragment ::getAntall )
394- .mapToInt (Long ::intValue )
395- .sum ())
396- .gjenopprettede (fragmenter .stream ()
397- .filter (fragment -> "GJENOPPRETTING" .equals (fragment .getGjenopprettstatus ()))
398- .map (OversiktFragment ::getAntall )
399- .mapToInt (Long ::intValue )
400- .sum ())
401- .build ())
374+ .map (fragmenter -> {
375+ var aarManed = fragmenter .getFirst ().getMaaned ();
376+ var yearMonth = YearMonth .parse (aarManed );
377+ return DashboardOversiktDTO .builder ()
378+ .aarManed (aarManed )
379+ .aar (yearMonth .getYear ())
380+ .maaned (yearMonth .getMonth ())
381+ .totaltAntallPersoner (fragmenter .stream ()
382+ .map (OversiktFragment ::getAntall )
383+ .mapToInt (Long ::intValue )
384+ .sum ())
385+ .nye (fragmenter .stream ()
386+ .filter (fragment -> "NYBESTILLING" .equals (fragment .getGjenopprettstatus ()))
387+ .map (OversiktFragment ::getAntall )
388+ .mapToInt (Long ::intValue )
389+ .sum ())
390+ .gjenopprettede (fragmenter .stream ()
391+ .filter (fragment -> "GJENOPPRETTING" .equals (fragment .getGjenopprettstatus ()))
392+ .map (OversiktFragment ::getAntall )
393+ .mapToInt (Long ::intValue )
394+ .sum ())
395+ .build ();
396+ })
402397 .sort (Comparator .comparing (DashboardOversiktDTO ::getAarManed ).reversed ());
403398 }
404399}
0 commit comments