// ============================================================================ // 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() } } }