diff --git a/Partner-Core/src/main/java/work/slhaf/partner/module/action/scheduler/ActionScheduler.kt b/Partner-Core/src/main/java/work/slhaf/partner/module/action/scheduler/ActionScheduler.kt index 5ab37b7a..25fffdb3 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/module/action/scheduler/ActionScheduler.kt +++ b/Partner-Core/src/main/java/work/slhaf/partner/module/action/scheduler/ActionScheduler.kt @@ -201,8 +201,13 @@ class ActionScheduler : AbstractAgentModule.Standalone() { val shouldBreak: Boolean ) - fun collectToTrigger(tick: Int, previousTick: Int, triggerHour: Int): Set? { - if (tick > previousTick) { + fun collectToTrigger( + tick: Int, + previousTick: Int, + triggerHour: Int, + includeRemainingHour: Boolean = false + ): Set? { + if (tick >= previousTick) { val toTrigger = mutableSetOf() for (i in previousTick..tick) { val bucket = wheel[i] @@ -213,6 +218,13 @@ class ActionScheduler : AbstractAgentModule.Standalone() { bucket.clear() // 避免重复触发 } } + if (includeRemainingHour) { + val remainingHourBucket = schedulableGroupByHour[triggerHour] + if (remainingHourBucket.isNotEmpty()) { + toTrigger.addAll(remainingHourBucket.filter { it.enabled }) + remainingHourBucket.clear() + } + } return toTrigger } return null @@ -261,7 +273,12 @@ class ActionScheduler : AbstractAgentModule.Standalone() { checkThenExecute(false) { if (it.hour != launchingHour) { shouldBreak = true - toTrigger = collectToTrigger(wheel.lastIndex, previousTick, launchingHour) + toTrigger = collectToTrigger( + wheel.lastIndex, + previousTick, + launchingHour, + includeRemainingHour = true + ) log.debug( "Hour changed, previousTick: {}, tick: {}, toTriggerSize: {}", previousTick, @@ -270,7 +287,12 @@ class ActionScheduler : AbstractAgentModule.Standalone() { ) return@checkThenExecute } - toTrigger = collectToTrigger(tick, previousTick, launchingHour) + toTrigger = collectToTrigger( + tick, + previousTick, + launchingHour, + includeRemainingHour = tick >= wheel.lastIndex + ) if (tick >= wheel.lastIndex || schedulableGroupByHour[launchingHour].isEmpty()) { state.value = WheelState.SLEEPING shouldBreak = true