/* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġtech . cuda . w od en . common . service Ċ Ċ import Ġme . li u wj . kt orm . database . Database Ċ import Ġme . li u wj . kt orm . dsl .* Ċ import Ġme . li u wj . kt orm . global .* Ċ import Ġtech . cuda . w od en . common . i 1 8 n . I 1 8 N Ċ import Ġtech . cuda . w od en . common . service . dao . Task DAO Ċ import Ġtech . cuda . w od en . common . service . dao . Task Dependency DAO Ċ import Ġtech . cuda . w od en . common . service . dto . Task DTO Ċ import Ġtech . cuda . w od en . common . service . dto . to Task DTO Ċ import Ġtech . cuda . w od en . common . service . enum . Task Type Ċ import Ġtech . cuda . w od en . common . service . exception . NotFoundException Ċ import Ġtech . cuda . w od en . common . service . exception . Operation Not Allow Exception Ċ import Ġtech . cuda . w od en . common . service . po . Task Dependency PO Ċ import Ġtech . cuda . w od en . common . service . po . Task PO Ċ import Ġtech . cuda . w od en . common . service . po . dtype . Schedule Dependency Info Ċ import Ġtech . cuda . w od en . common . service . po . dtype . Schedule Format Ċ import Ġtech . cuda . w od en . common . service . po . dtype . Schedule Period Ċ import Ġtech . cuda . w od en . common . service . po . dtype . Schedule Priority Ċ import Ġjava . time . LocalDateTime Ċ Ċ /** Ċ Ġ* Ġ@ author ĠJ ens en ĠQ i Ġ< j inx iu . qi @ alu . hit . edu . cn > Ċ Ġ* Ġ@ since Ġ 0 . 1 . 0 Ċ Ġ*/ Ċ object ĠTask Service Ġ: ĠService ( Task DAO ) Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĨ é¡µ æŁ¥è¯¢ ä»»åĬ¡ åĪĹè¡¨ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æıĲä¾ĽäºĨ [ name Like ] ï¼Į åĪĻ å¯¹ ä»»åĬ¡ åĲį è¿Ľè¡Į æ¨¡ ç³ Ĭ æŁ¥è¯¢ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æıĲä¾ĽäºĨ [ owner Id ] ï¼Į åĪĻ è¿ĩæ»¤ åĩº æĮĩå®ļ çĶ¨æĪ· è´Ł è´£ çļĦ ä»»åĬ¡ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æıĲä¾ĽäºĨ [ team Id ] ï¼Į åĪĻ è¿ĩæ»¤ åĩº æĮĩå®ļ é¡¹çĽ® ç»Ħ çļĦ ä»»åĬ¡ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æıĲä¾ĽäºĨ [ period ] ï¼Į åĪĻ è¿ĩæ»¤ åĩº æĮĩå®ļ è°ĥ åº¦ åĳ¨æľŁ çļĦ ä»»åĬ¡ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æıĲä¾ĽäºĨ [ queue ] ï¼Į åĪĻ è¿ĩæ»¤ åĩº æĮĩå®ļ è°ĥ åº¦ éĺŁåĪĹ çļĦ ä»»åĬ¡ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ æıĲä¾ĽäºĨ [ isValid ] ï¼Į åĪĻ è¿ĩæ»¤ åĩº è°ĥ åº¦ çĶŁ æķĪ / ä¸į çĶŁ æķĪ çļĦ ä»»åĬ¡ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlisting ( ĊĠĠĠĠĠĠĠ Ġpage : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠpageSize : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġname Like : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġowner Id : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġperiod : ĠSchedule Period ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġqueue : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġteam Id : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠisValid : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġids : ĠList < Int >? Ġ= Ġnull ĊĠĠĠ Ġ): ĠPair < List < Task DTO >, ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconditions Ġ= Ġmutable ListOf ( Task DAO . is Remove Ġeq Ġfalse ) ĊĠĠĠĠĠĠĠ Ġowner Id ?. let Ġ{ Ġconditions . add ( Task DAO . owner Id Ġeq Ġowner Id ) Ġ} ĊĠĠĠĠĠĠĠ Ġperiod ?. let Ġ{ Ġconditions . add ( Task DAO . period Ġeq Ġperiod ) Ġ} ĊĠĠĠĠĠĠĠ Ġqueue ?. let Ġ{ Ġconditions . add ( Task DAO . queue Ġeq Ġqueue ) Ġ} ĊĠĠĠĠĠĠĠ Ġteam Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġteam Ġ= ĠTeam Service . findById ( team Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( team Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconditions . add ( Task DAO . filePath . like ("/ ${ team . name }/ % ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠisValid ?. let Ġ{ Ġconditions . add ( Task DAO . isValid Ġeq ĠisValid ) Ġ} ĊĠĠĠĠĠĠĠ Ġids ?. let Ġ{ Ġconditions . add ( Task DAO . id . in List ( ids ) Ġeq Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( tasks , Ġcount ) Ġ= Ġbatch < Task PO >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Id Ġ= Ġpage , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize Ġ= ĠpageSize , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Ġ= Ġconditions . reduce Ġ{ Ġa , Ġb Ġ-> Ġa Ġand Ġb Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlike Ġ= ĠTask DAO . name . match ( name Like ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠorderBy Ġ= ĠTask DAO . id . desc () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtasks . map Ġ{ Ġit . to Task DTO () Ġ} Ġto Ġcount ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥è¯¢ ä»»åĬ¡ [ taskId ] çļĦ åŃĲ ä»»åĬ¡ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlisting Children ( taskId : ĠInt ): ĠList < Task DTO > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdownstream Dependencies Ġ= ĠTask Dependency DAO . select () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Ġ{ Ġ( Task Dependency DAO . is Remove Ġeq Ġfalse ) Ġand Ġ( Task Dependency DAO . parentId Ġeq ĠtaskId ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠTask Dependency DAO . create Entity ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( down stream Dependencies . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask DAO . select () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Ġ{ Ġ( Task DAO . is Remove Ġeq Ġfalse ) Ġand Ġ( Task DAO . id . in List ( down stream Dependencies . map Ġ{ Ġit . child Id Ġ}) Ġeq Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠTask DAO . create Entity ( it ). to Task DTO () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥è¯¢ ä»»åĬ¡ [ taskId ] çļĦ çĪ¶ ä»»åĬ¡ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlisting Parent ( taskId : ĠInt ): ĠList < Task DTO > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupstream Dependencies Ġ= ĠTask Dependency DAO . select () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Ġ{ Ġ( Task Dependency DAO . is Remove Ġeq Ġfalse ) Ġand Ġ( Task Dependency DAO . child Id Ġeq ĠtaskId ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠTask Dependency DAO . create Entity ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( upstream Dependencies . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask DAO . select () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Ġ{ Ġ( Task DAO . is Remove Ġeq Ġfalse ) Ġand Ġ( Task DAO . id . in List ( upstream Dependencies . map Ġ{ Ġit . parentId Ġ}) Ġeq Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠTask DAO . create Entity ( it ). to Task DTO () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥ æī¾ æĮĩå®ļ Ġid ĠçļĦ ä»»åĬ¡ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä»»åĬ¡ ä¸įåŃĺåľ¨ æĪĸ å·² è¢« åĪłéĻ¤ ï¼Į åĪĻ è¿ĶåĽŀ Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfind ById ( id : ĠInt ) Ġ= Ġfind < Task PO >( where Ġ= ĠTask DAO . is Remove Ġeq Ġfalse Ġand Ġ( Task DAO . id Ġeq Ġid )) ?. to Task DTO () ĊĊĊĠĠĠ Ġprivate Ġfun Ġcheck Parent All Valid ( parent Ids : ĠSet < Int >): ĠList < Task DTO > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Tasks Ġ= Ġlisting ( ids Ġ= Ġparent Ids . toList ()). first ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Tasks . size Ġ!= Ġparent Ids . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠNotFound Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI 1 8 N . parent Task , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( parent Ids Ġ- Ġparent Tasks . map Ġ{ Ġit . id Ġ}). join ToString ("," ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI 1 8 N . not Exists Or HasBeen Remove ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġinvalid Ids Ġ= Ġparent Tasks . filter Ġ{ Ġ! it . isValid Ġ}. map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( invalid Ids . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOperation Not Allow Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI 1 8 N . parent Task , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvalid Ids . join ToString ("," ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI 1 8 N . invalid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ",", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI 1 8 N . dependency Not Allow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġparent Tasks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠéĢļè¿ĩ [ filePath ] çļĦ åĲİ ç¼Ģ åĪ¤æĸŃ ä»»åĬ¡ ç±»åŀĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Task Type By FilePath ( filePath : ĠString ): ĠTask Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= ĠfilePath . split ("/ "). last (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . contains (". ")) Ġ{ Ġ" suffix Ġmissing " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsuffix Ġ= ĠfileName . split (". "). last () ĊĠĠĠĠĠĠĠ Ġreturn ĠTask Type . values (). find Ġ{ Ġit . suffix Ġ== Ġsuffix Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" unsupported Ġsuffix Ġ$ suffix ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪĽå»º ä»»åĬ¡ ï¼Į å¹¶ è¿ĶåĽŀ ĠD TO ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ [ owner Id ] çĶ¨æĪ· æ²¡æľī é¡¹çĽ® ç»Ħ æĿĥéĻĲ ï¼Į åĪĻ æĬĽ åĩº ĠPermission Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ [ owner Id ] çĶ¨æĪ· å·² è¢« åĪłéĻ¤ æĪĸ æŁ¥æī¾ ä¸įåĪ° ï¼Į åĪĻ æĬĽ åĩº ĠNotFound Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä¾Ŀèµĸ çļĦ çĪ¶ ä»»åĬ¡ [ parent ] æľī å¤± æķĪ çļĦ ï¼Į åĪĻ æĬĽ åĩº ĠOperation Not Allow Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä¾Ŀèµĸ çļĦ çĪ¶ ä»»åĬ¡ [ parent ] æľī è¢« åĪłéĻ¤ çļĦ æĪĸ å·² å¤± æķĪ çļĦ ï¼Į åĪĻ æĬĽ åĩº ĠNotFound Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ è°ĥ åº¦ æł¼å¼ı [ format ] éĿŀ æ³ķ ï¼Į åĪĻ æĬĽ åĩº ĠOperation Not Allow Exception ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate ( ĊĠĠĠĠĠĠĠ ĠfilePath : ĠString , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġowner Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġargs : ĠMap < String , ĠString > Ġ= Ġmap Of (), ĊĠĠĠĠĠĠĠ Ġis Soft Fail : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġperiod : ĠSchedule Period , ĊĠĠĠĠĠĠĠ Ġformat : ĠSchedule Format , ĊĠĠĠĠĠĠĠ Ġqueue : ĠString , ĊĠĠĠĠĠĠĠ Ġpriority : ĠSchedule Priority Ġ= ĠSchedule Priority . VERY _ LOW , ĊĠĠĠĠĠĠĠ Ġpending Timeout : ĠInt Ġ= ĠInt . MAX _ VALUE , ĊĠĠĠĠĠĠĠ Ġrunning Timeout : ĠInt Ġ= ĠInt . MAX _ VALUE , ĊĠĠĠĠĠĠĠ Ġparent : ĠMap < Int , ĠSchedule Dependency Info >, ĊĠĠĠĠĠĠĠ Ġretries : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġretry Delay : ĠInt Ġ= Ġ 5 ĊĠĠĠ Ġ): ĠTask DTO Ġ= ĠDatabase . global . use Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġformat . require Valid ( period ) ĊĠĠĠĠĠĠĠ Ġval Ġteam Ġ= ĠTeam Service . findBy FilePath ( filePath ) ĊĠĠĠĠĠĠĠ Ġrequire ( team Ġ!= Ġnull ) Ġ{ Ġ" team Ġ${ Team Service . findBy FilePath ( filePath )} Ġnot Ġexists " Ġ} ĊĠĠĠĠĠĠĠ ĠPerson Service . require Exists ( owner Id ). require Team Member ( owner Id , Ġteam . id ) ĊĠĠĠĠĠĠĠ Ġcheck Parent All Valid ( parent . keys ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠåĪĽå»º ä»»åĬ¡ åıĬ ä¾Ŀèµĸ ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= ĠTask PO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . filePath Ġ= ĠfilePath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . owner Id Ġ= Ġowner Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . args Ġ= Ġargs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Soft Fail Ġ= Ġis Soft Fail ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . period Ġ= Ġperiod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . format Ġ= Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . queue Ġ= Ġqueue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . priority Ġ= Ġpriority ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pending Timeout Ġ= Ġpending Timeout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . running Timeout Ġ= Ġrunning Timeout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . retries Ġ= Ġretries ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . retry Delay Ġ= Ġretry Delay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . isValid Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Remove Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . update Time Ġ= Ġnow ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġt Ġ-> ĠTask DAO . add Entity ( t ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġparent . map Ġ{ Ġ( parentId , Ġdependency ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Dependency DAO . add Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Dependency PO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . parentId Ġ= ĠparentId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . child Id Ġ= Ġtask . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . wait Timeout Ġ= Ġdependency . wait Timeout ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . offset Day Ġ= Ġdependency . offset Day ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Remove Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . update Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtask . to Task DTO () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæĽ´æĸ° æĮĩå®ļ ä»»åĬ¡ [ id ] çļĦä¿¡æģ¯ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä»»åĬ¡ [ id ] ä¸įåŃĺåľ¨ æĪĸ å·² åĪłéĻ¤ ï¼Į åĪĻ æĬĽ åĩº ĠNotFound Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ è¯ķ åĽ¾ æĽ´æĸ° [ owner Id ] ï¼Į ä¸Ķ çĶ¨æĪ· æŁ¥æī¾ ä¸įåĪ° ï¼Į åĪĻ æĬĽ åĩº ĠNotFound Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ è¯ķ åĽ¾ æĽ´æĸ° [ owner Id ] ï¼Į ä¸Ķ çĶ¨æĪ· ä¸į å½Ĵ å±ŀ äºİ ä»»åĬ¡ çļĦ é¡¹çĽ® ç»Ħ ï¼Į åĪĻ æĬĽ åĩº ĠPermission Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ è¯ķ åĽ¾ æĽ´æĸ° [ parent ] ï¼Į ä¸Ķ åĪĹè¡¨ ä¸Ń åŃĺåľ¨ å·² åĪłéĻ¤ çļĦ æĪĸ ä¸įåŃĺåľ¨ çļĦ ä»»åĬ¡ ï¼Į åĪĻ æĬĽ åĩº ĠNotFound Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ è¯ķ åĽ¾ æĽ´æĸ° [ parent ] ï¼Į ä¸Ķ åĪĹè¡¨ ä¸Ń åŃĺåľ¨ å¤± æķĪ çļĦ ä»»åĬ¡ ï¼Į åĪĻ æĬĽ åĩº ĠIllegalArgumentException ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ è¯ķ åĽ¾ æĽ´æĸ° [ period ] ï¼Į ä¸Ķ æ²¡æľī æıĲä¾Ľ [ format ] æĪĸ [ format ] éĿŀ æ³ķ ï¼Į åĪĻ æĬĽ åĩº ĠOperation Not Allow Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ è¯ķ åĽ¾ æĽ´æĸ° [ format ] ï¼Į ä¸Ķ æł¼å¼ı éĿŀ æ³ķ ï¼Į åĪĻ æĬĽ åĩº ĠOperation Not Allow Exception ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate ( ĊĠĠĠĠĠĠĠ Ġid : ĠInt , ĊĠĠĠĠĠĠĠ Ġname : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġowner Id : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġargs : ĠMap < String , ĠAny >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġis Soft Fail : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġperiod : ĠSchedule Period ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġformat : ĠSchedule Format ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġqueue : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġpriority : ĠSchedule Priority ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġpending Timeout : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġrunning Timeout : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġparent : ĠMap < Int , ĠSchedule Dependency Info >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġretries : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġretry Delay : ĠInt ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠisValid : ĠBoolean ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠTask DTO Ġ= ĠDatabase . global . use Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġfind < Task PO >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġ= ĠTask DAO . is Remove Ġeq Ġfalse Ġand Ġ( Task DAO . id Ġeq Ġid ) ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠNotFound Exception ( I 1 8 N . task , Ġid , ĠI 1 8 N . not Exists Or HasBeen Remove ) ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠ Ġname ?. let Ġ{ Ġtask . name Ġ= Ġname Ġ} ĊĠĠĠĠĠĠĠ Ġowner Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġteam Ġ= ĠTeam Service . findBy FilePath ( task . filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( team Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPerson Service . require Exists ( it ). require Team Member ( it , Ġteam Id Ġ= Ġteam . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġargs ?. let Ġ{ Ġtask . args Ġ= Ġargs Ġ} ĊĠĠĠĠĠĠĠ Ġis Soft Fail ?. let Ġ{ Ġtask . is Soft Fail Ġ= Ġis Soft Fail Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Ġ!= Ġnull Ġ&& Ġformat Ġ== Ġnull Ġ-> Ġthrow ĠOperation Not Allow Exception ( I 1 8 N . schedule Format , ĠI 1 8 N . missing ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Ġ== Ġnull Ġ&& Ġformat Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat . require Valid ( task . period ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . format Ġ= Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Ġ!= Ġnull Ġ&& Ġformat Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformat . require Valid ( period ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . period Ġ= Ġperiod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . format Ġ= Ġformat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġqueue ?. let Ġ{ Ġtask . queue Ġ= Ġqueue Ġ} ĊĠĠĠĠĠĠĠ Ġpriority ?. let Ġ{ Ġtask . priority Ġ= Ġpriority Ġ} ĊĠĠĠĠĠĠĠ Ġpending Timeout ?. let Ġ{ Ġtask . pending Timeout Ġ= Ġpending Timeout Ġ} ĊĠĠĠĠĠĠĠ Ġrunning Timeout ?. let Ġ{ Ġtask . running Timeout Ġ= Ġrunning Timeout Ġ} ĊĠĠĠĠĠĠĠ Ġparent ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Parent Task Ġ= Ġcheck Parent All Valid ( parent . keys ). map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Parent Task Ġ= Ġlisting Parent ( task . id ). map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Be Remove Ġ= Ġcurrent Parent Task Ġ- Ġtarget Parent Task ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Be Insert Ġ= Ġtarget Parent Task Ġ- Ġcurrent Parent Task ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Be Update Ġ= Ġcurrent Parent Task . filter Ġ{ Ġtarget Parent Task . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTask Dependency DAO . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( it . is Remove , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( it . update Time , Ġnow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . parentId . in List ( toBe Remove ) Ġeq Ġtrue ) Ġand Ġ( it . child Id Ġeq Ġtask . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Be Insert . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Dependency DAO . add Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Dependency PO Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . parentId Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . child Id Ġ= Ġtask . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . wait Timeout Ġ= Ġparent [ it ] !!. wait Timeout ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . offset Day Ġ= Ġparent [ it ] !!. offset Day ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Remove Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . create Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . update Time Ġ= Ġnow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Be Update . forEach Ġ{ ĠparentId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Dependency DAO . update Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( it . wait Timeout , Ġparent [ parentId ] !!. wait Timeout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( it . offset Day , Ġparent [ parentId ] !!. offset Day ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( it . update Time , Ġnow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . parentId Ġeq ĠparentId ) Ġand Ġ( it . child Id Ġeq Ġtask . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġretries ?. let Ġ{ Ġtask . retries Ġ= Ġretries Ġ} ĊĠĠĠĠĠĠĠ Ġretry Delay ?. let Ġ{ Ġtask . retry Delay Ġ= Ġretry Delay Ġ} ĊĠĠĠĠĠĠĠ ĠisValid ?. let Ġ{ Ġtask . isValid Ġ= ĠisValid Ġ} ĊĠĠĠĠĠĠĠ Ġany NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , Ġowner Id , Ġargs , Ġis Soft Fail , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperiod , Ġqueue , Ġpriority , Ġpending Timeout , Ġrunning Timeout , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġretries , Ġretry Delay , ĠisValid ĊĠĠĠĠĠĠĠ Ġ) ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . update Time Ġ= ĠLocalDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . flush Changes () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtask . to Task DTO () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪłéĻ¤ æĮĩå®ļ [ id ] çļĦ ä»»åĬ¡ ï¼Į å¹¶ æ¸ħ çĲĨ å®ĥ å½Ĵ å±ŀ çļĦ ä»»åĬ¡ åĴĮ å®ŀä¾ĭ ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä»»åĬ¡ [ id ] ä¸įåŃĺåľ¨ æĪĸ å·² è¢« åĪłéĻ¤ ï¼Į åĪĻ æĬĽ åĩº ĠNotFound Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä»»åĬ¡ [ id ] å¤Ħ äºİ è°ĥ åº¦ çĶŁ æķĪ çĬ¶æĢģ ï¼Į åĪĻ æĬĽ åĩº ï¼Į åĪĻ æĬĽ åĩº ĠOperation Not Allow Exception ĊĠĠĠĠ Ġ* Ġå¦Ĥæŀľ ä»»åĬ¡ [ id ] çļĦ åŃĲ ä»»åĬ¡ åŃĺåľ¨ æľª å¤± æķĪ çļĦ åŃĲ ä»»åĬ¡ ï¼Į åĪĻ æĬĽ åĩº ĠOperation Not Allow Exception ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove ( id : ĠInt ) Ġ= ĠDatabase . global . use Transaction Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġfind < Task PO >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhere Ġ= ĠTask DAO . is Remove Ġeq Ġfalse Ġand Ġ( Task DAO . id Ġeq Ġid ) ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġthrow ĠNotFound Exception ( I 1 8 N . task , Ġid , ĠI 1 8 N . not Exists Or HasBeen Remove ) ĊĠĠĠĠĠĠĠ Ġif Ġ( task . isValid ) Ġthrow ĠOperation Not Allow Exception ( I 1 8 N . task , ĠI 1 8 N . isValid , Ġ",", ĠI 1 8 N . remove Not Allow ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalid Children Ġ= Ġlisting Children ( task . id ). filter Ġ{ Ġit . isValid Ġ}. map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( valid Children . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠOperation Not Allow Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI 1 8 N . children Task , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalid Children . join ToString ("," ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI 1 8 N . isValid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ",", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI 1 8 N . remove Not Allow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠLocalDateTime . now () ĊĊĠĠĠĠĠĠĠ Ġ// Ġæ¸ ħ çĲĨ å½Ĵ å±ŀ çļĦ ä½ľ ä¸ļ ĊĠĠĠĠĠĠĠ ĠJob Service . remove ( taskId Ġ= Ġtask . id ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ æľĢåĲİ æ¸ħ çĲĨ ä»»åĬ¡ ĊĠĠĠĠĠĠĠ Ġtask . is Remove Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtask . update Time Ġ= Ġnow ĊĠĠĠĠĠĠĠ Ġtask . flush Changes () ĊĠĠĠ Ġ} Ċ }