package Ġcom . q ing zh u . message server . service Ċ Ċ import Ġcom . hazelcast . config . Index Type Ċ import Ġcom . hazelcast . core . H azelcast Instance Ċ import Ġcom . hazelcast . query . Predicate Ċ import Ġcom . hazelcast . query . impl . predicates . And Predicate Ċ import Ġcom . hazelcast . query . impl . predicates . Equal Predicate Ċ import Ġcom . hazelcast . query . impl . predicates . NotEqual Predicate Ċ import Ġcom . q ing zh u . message server . domain . constant . Online Status Ċ import Ġcom . q ing zh u . message server . domain . dto . Staff Change Status Dto Ċ import Ġcom . q ing zh u . message server . domain . dto . Staff Dispatcher Dto Ċ import Ġcom . q ing zh u . message server . domain . dto . Staff Status Dto Ċ import Ġcom . q ing zh u . message server . domain . dto . Update Staff Status Ċ import Ġcom . q ing zh u . message server . domain . entity . Staff Status Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . as Flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġorg . springframework . beans . factory . annotation . Qualifier Ċ import Ġorg . springframework . security . access . pre post . Pre Authorize Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġreactor . core . publisher . Flux Ċ import Ġreactor . core . publisher . Mono Ċ import Ġreactor . kotlin . core . publisher . switch If Empty Ċ import Ġreactor . kotlin . core . publisher . to Flux Ċ import Ġreactor . kotlin . core . publisher . to Mono Ċ import Ġreactor . util . retry . Retry Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ @ Service Ċ class ĠStaff Status Service ( ĊĠĠĠ Ġ@ Qualifier (" hazelcast Instance ") ĊĠĠĠ Ġprivate Ġval Ġh azelcast Instance : ĠH azelcast Instance , Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġfun ĠgetStatus Map ( organization Id : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġh azelcast Instance . getMap < Long , ĠStaff Status >(" $ organization Id : staff ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġè®¾ç½® å®¢ æľį çĬ¶æĢģ ĊĠĠĠĠ Ġ* Ġ éĿŀ åİŁ åŃĲ åĮĸ æĽ´æĸ° ï¼Į åı¯èĥ½ æķ°æį® ä¸ ¢ å¤± ĊĠĠĠĠ Ġ* Ġ[ hazelcast Ġ åİŁ åŃĲ çĬ¶æĢģ è®¾ç½® ]( https :// docs . hazelcast . com / im dg / latest / computing / entry - processor . html ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave Status ( staff Status : ĠStaff Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatus Map Ġ= ĠgetStatus Map ( staff Status . organization Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( status Map . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Map . addIndex ( Index Type . BITMAP , Ġ" sh unt [ any ]") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Map . addIndex ( Index Type . HASH , Ġ" online Status ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Map . addIndex ( Index Type . HASH , Ġ" auto Busy ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstatus Map . put ( staff Status . staff Id , Ġstaff Status , Ġ 2 , ĠTimeUnit . HOUR S ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreplace Status ( old Staff Status : ĠStaff Status , Ġstaff Status : ĠStaff Status ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatus Map Ġ= ĠgetStatus Map ( staff Status . organization Id ) ĊĠĠĠĠĠĠĠ Ġstatus Map . set T tl ( staff Status . staff Id , Ġ 2 , ĠTimeUnit . HOUR S ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstatus Map . replace ( staff Status . staff Id , Ġold Staff Status , Ġstaff Status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreplace Status With Exception ( old Staff Status : ĠStaff Status ?, Ġstaff Status : ĠStaff Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( old Staff Status Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! replace Status ( old Staff Status , Ġstaff Status )) Ġthrow ĠConcurrent Modification Exception () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Status ( staff Status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġregister OrUpdate Staff ( staff Status Dto : ĠStaff Status Dto ): ĠMono < Staff Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconsistency Update ( staff Status Dto . organization Id , Ġstaff Status Dto . staff Id ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Staff Status Ġ= Ġstaff Status Dto . to Staff Status ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Staff Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. switch If Empty Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Staff Status Ġ= Ġstaff Status Dto . to Staff Status () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Staff Status . to Mono () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĸ°å¢ŀ æĪĸ æĽ´æĸ° çĬ¶æĢģ ï¼Į å¦Ĥæŀľ çĬ¶æĢģ è¢« æĽ´æĸ° è¿ĩ ï¼Į éĩįæĸ° èİ·åıĸ å¹¶ åĨį æ¬¡ æĽ´æĸ° ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconsistency Update ( ĊĠĠĠĠĠĠĠ Ġorganization Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġstaff Id : ĠLong , ĊĠĠĠĠĠĠĠ Ġrun : ĠMono < Staff Status >. () Ġ-> ĠMono < Staff Status > ĊĠĠĠ Ġ): ĠMono < Staff Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġold Staff Status Ġ= ĠAtomic Reference < Staff Status >() ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Staff ( organization Id , Ġstaff Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Staff Status . set ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġè¿ĶåĽŀ Ġcopy Ġå¯¹è±¡ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . deep Copy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform ( run ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplace Status With Exception ( old Staff Status . get (), Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retry When ( Retry . in def initely (). filter Ġ{ Ġit Ġis ĠConcurrent Modification Exception Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ Ġåľ¨ çº¿ Ġï¼Į çĬ¶æĢģ å°± ç» ª ï¼Į ç©º éĹ ² çļĦ å®¢ æľį ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġfind Idle Staff ( organization Id : ĠInt , Ġsh unt Id : ĠLong , Ġbot : ĠBoolean Ġ= Ġfalse ): ĠCollection < Staff Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatus Map Ġ= ĠgetStatus Map ( organization Id ) ĊĠĠĠĠĠĠĠ Ġval Ġpredicate List : ĠMutable List < Predicate < *, Ġ* >> Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġåľ¨ å½ĵåīį æİ¥ å¾ħ ç»Ħ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEqual Predicate (" sh unt [ any ]", Ġsh unt Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġåľ¨ çº¿ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEqual Predicate (" online Status ", ĠOnline Status . ON LINE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æİ¥ å¾ħ æľª æ»¡ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEqual Predicate (" auto Busy ", Ġfalse ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( bot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpredicate List . add ( Equal Predicate (" staff Type ", Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpredicate List . add ( Equal Predicate (" staff Type ", Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġand Predicate Ġ= ĠAnd Predicate (* predicate List . to Typed Array ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstatus Map . values ( and Predicate Ġas ĠPredicate < Long , ĠStaff Status >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Idle Staff With Staff Dispatcher Dto ( organization Id : ĠInt , Ġsh unt Id : ĠLong ): ĠFlow < Staff Dispatcher Dto > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Idle Staff ( organization Id , Ġsh unt Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠStaff Dispatcher Dto . from Staff Status And Sh unt Id ( sh unt Id , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Bot Staff With Staff Dispatcher Dto ( organization Id : ĠInt , Ġsh unt Id : ĠLong ): ĠFlow < Staff Dispatcher Dto > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Idle Staff ( organization Id , Ġsh unt Id , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Flow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠStaff Dispatcher Dto . from Staff Status And Sh unt Id ( sh unt Id , Ġit ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetStatus Offline ( staff Change Status Dto : ĠStaff Change Status Dto ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatus Map Ġ= ĠgetStatus Map ( staff Change Status Dto . organization Id ) ĊĠĠĠĠĠĠĠ Ġval Ġstaff Status Ġ= Ġstatus Map [ staff Change Status Dto . staff Id ] ĊĠĠĠĠĠĠĠ Ġif Ġ( staff Status Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstaff Status . set Offline ( staff Change Status Dto . clientId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Map . put ( staff Change Status Dto . staff Id , Ġstaff Status , Ġ 1 , ĠTimeUnit . HOUR S ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Staff Status ( update Staff Status : ĠUpdate Staff Status ): ĠMono < Staff Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconsistency Update ( update Staff Status . organization Id !! , Ġupdate Staff Status . staff Id !! ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . online Status Ġ= Ġupdate Staff Status . online Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfind Staff ( organization Id : ĠInt , Ġstaff Id : ĠLong ): ĠMono < Staff Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMono . create Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Map Ġ= ĠgetStatus Map ( organization Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . success ( status Map [ staff Id ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĨ éħį å®¢ æľį ï¼Į æľī ä¸Ģ å®ļçļĦ ä¸į ä¸Ģèĩ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġassignment ( staff Change Status Dto : ĠStaff Change Status Dto ): ĠMono < Staff Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġconsistency Update ( staff Change Status Dto . organization Id , Ġstaff Change Status Dto . staff Id ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . auto Busy Ġ&& Ġit . online Status Ġ== ĠOnline Status . ON LINE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĩįæĸ° ä¿ĿåŃĺ çĬ¶æĢģ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . current Service Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . userId List . add ( staff Change Status Dto . userId !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Customer ( organization Id : ĠInt , Ġstaff Id : ĠLong , ĠuserId : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconsistency Update ( organization Id , Ġstaff Id ) ĊĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ éĩįæĸ° ä¿ĿåŃĺ çĬ¶æĢģ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . current Service Count -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . userId List . remove ( userId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. subscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æīĢæľī åľ¨ çº¿ å®¢ æľį åĪĹè¡¨ ĊĠĠĠĠ Ġ* Ġ ç®¡çĲĨåĳĺ æĿĥéĻĲ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Pre Authorize (" has Role (' ADMIN ') ") ĊĠĠĠ Ġfun ĠfindAll Online Staff ( organization Id : ĠInt ): ĠFlux < Staff Status > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstatus Map Ġ= ĠgetStatus Map ( organization Id ) ĊĠĠĠĠĠĠĠ Ġval Ġpredicate List Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æİ¥ å¾ħ ç»Ħ ä¸į ä¸ºç©º ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNot Equal Predicate (" sh unt [ 0 ]", Ġnull ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġåľ¨ çº¿ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNot Equal Predicate (" online Status ", ĠOnline Status . OFF LINE ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġand Predicate Ġ= ĠAnd Predicate (* predicate List . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġreturn Ġstatus Map . values ( and Predicate Ġas ĠPredicate < Long , ĠStaff Status >). to Flux () ĊĠĠĠ Ġ} Ċ } Ċ