| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // ============================================================================
- // reminderservice.go — 定时提醒
- //
- // 「工具」页定时提醒:设置提醒信息和间隔分钟数,每 xx 分钟广播一次
- // periodicReminder 事件(前端弹窗显示)并唤出主窗口,直到手动取消。
- // ============================================================================
- package main
- import (
- "fmt"
- "strings"
- "sync"
- "time"
- )
- // 定时提醒运行状态
- var (
- reminderMu sync.Mutex
- reminderStop chan struct{} // 停止信号(取消定时提醒时 close)
- reminderText string // 当前提醒信息
- reminderEvery time.Duration // 当前间隔
- reminderNext time.Time // 下次提醒时刻
- reminderRun bool // 是否在运行
- )
- // StartReminder 启动(或更新)定时提醒:每 every 分钟提醒一次,直到取消。
- // message 为提醒信息,minutes 为间隔分钟数(必须 >=1)。
- // 返回启动状态描述(含下次提醒时刻),供前端提示。
- func (s *SettingsService) StartReminder(message string, minutes int) string {
- msg := strings.TrimSpace(message)
- if msg == "" {
- return "请输入提醒信息"
- }
- if minutes < 1 {
- return "间隔分钟数必须 ≥ 1"
- }
- reminderMu.Lock()
- defer reminderMu.Unlock()
- // 已运行则先停止旧定时器
- if reminderRun {
- close(reminderStop)
- }
- reminderText = msg
- reminderEvery = time.Duration(minutes) * time.Minute
- reminderStop = make(chan struct{})
- reminderRun = true
- reminderNext = time.Now().Add(reminderEvery)
- go reminderLoop(reminderStop, msg, reminderEvery)
- return fmt.Sprintf("已启动:每 %d 分钟提醒「%s」,下次 %s", minutes, msg, reminderNext.Format("15:04:05"))
- }
- // StopReminder 取消定时提醒。返回是否在运行过。
- func (s *SettingsService) StopReminder() string {
- reminderMu.Lock()
- defer reminderMu.Unlock()
- if !reminderRun {
- return "定时提醒未运行"
- }
- close(reminderStop)
- reminderRun = false
- reminderText = ""
- reminderEvery = 0
- reminderNext = time.Time{}
- return "已取消定时提醒"
- }
- // ReminderStatus 查询当前定时提醒状态(运行中 / 间隔 / 下次时刻)。
- func (s *SettingsService) ReminderStatus() string {
- reminderMu.Lock()
- defer reminderMu.Unlock()
- if !reminderRun {
- return ""
- }
- return fmt.Sprintf("运行中|每 %d 分钟|下次 %s",
- int(reminderEvery.Minutes()), reminderNext.Format("15:04:05"))
- }
- // reminderLoop 每间隔提醒一次:广播 periodicReminder 事件并唤出主窗口。
- // stop 关闭时退出循环。
- func reminderLoop(stop chan struct{}, msg string, every time.Duration) {
- ticker := time.NewTicker(every)
- defer ticker.Stop()
- for {
- select {
- case <-stop:
- return // 已取消
- case now := <-ticker.C:
- payload := msg + "\n" + now.Format("2006-01-02 15:04:05")
- app.Event.Emit("periodicReminder", payload)
- showMainWindow()
- }
- }
- }
|