killapp/Assets/Scripts/UI/Pages/HomePage/HomePageSchedule.cs

185 lines
6.0 KiB
C#
Raw Normal View History

using System;
using System.Collections;
using System.Collections.Generic;
using Kill.Bluetooth.Protocol;
using Kill.Managers;
using UnityEngine;
using UnityEngine.UI;
namespace Kill.UI.Pages
{
public class HomePageSchedule : MonoBehaviour
{
ScheduleTask[] tasks;
public Image scheduleIcon;
/// <summary>
/// 定时任务图标 0未设置 1已设置
/// </summary>
public Sprite[] scheduleIconSprites;
public Text scheduleText;
// 多语言Key
private const string LANG_STANDBY = "100094"; // Standby 待机
private const string LANG_SCAN = "100095"; // Scan 扫描
private const string LANG_ARMED = "100096"; // Armed 消杀
private const string LANG_NO_SCHEDULE = "100101"; // No Schedule 无定时任务
public void Init(ScheduleTask[] tasks)
{
this.tasks = tasks;
UpdateScheduleDisplay();
}
/// <summary>
/// 更新定时任务显示
/// </summary>
private void UpdateScheduleDisplay()
{
// 获取今天的星期几0=周日, 1=周一, ... 6=周六)
DayOfWeek today = DateTime.Now.DayOfWeek;
byte todayFlag = GetDayFlag(today);
// 查找今天启用的任务
ScheduleTask? todayTask = FindTodayTask(todayFlag);
if (todayTask.HasValue)
{
// 有今日任务,显示最近的一个
DisplayTask(todayTask.Value);
SetIconScheduled(true);
}
else
{
// 没有今日任务
DisplayNoSchedule();
SetIconScheduled(false);
}
}
/// <summary>
/// 查找今天启用的任务(返回最近的一个未开始任务,排除进行中任务)
/// </summary>
private ScheduleTask? FindTodayTask(byte todayFlag)
{
if (tasks == null || tasks.Length == 0)
return null;
ScheduleTask? nearestTask = null;
int nearestTimeDiff = int.MaxValue;
int currentTime = DateTime.Now.Hour * 60 + DateTime.Now.Minute;
foreach (var task in tasks)
{
2026-05-18 08:42:33 +08:00
// 检查任务是否启用
if (!task.Enabled)
continue;
// 检查是否是今天的任务:
// 1. Repeat == 0 表示仅一次,认为是当天的任务
// 2. Repeat & todayFlag != 0 表示今天有重复
bool isTodayTask = task.Repeat == 0 || (task.Repeat & todayFlag) != 0;
if (!isTodayTask)
continue;
int taskTime = task.StartHour * 60 + task.StartMinute;
// 只保留未开始的任务
if (currentTime >= taskTime)
2026-05-18 08:42:33 +08:00
continue;
int timeDiff = taskTime - currentTime;
// 找距离当前时间最近的未开始任务
if (timeDiff < nearestTimeDiff)
{
nearestTimeDiff = timeDiff;
2026-05-18 08:42:33 +08:00
nearestTask = task;
}
}
return nearestTask;
}
/// <summary>
/// 显示任务信息
/// </summary>
private void DisplayTask(ScheduleTask task)
{
string modeText = GetModeText(task.Mode);
string timeText = $"{task.StartHour:D2}:{task.StartMinute:D2}";
if (scheduleText != null)
{
// 经过 FindTodayTask 筛选后,只可能是未开始的任务
scheduleText.text = $"{modeText}: {timeText}";
}
}
/// <summary>
/// 显示无定时任务
/// </summary>
public void DisplayNoSchedule()
{
if (scheduleText != null)
{
string noScheduleText = LanguageManager.Instance?.GetLanguage(LANG_NO_SCHEDULE) ?? "No Schedule";
scheduleText.text = noScheduleText;
}
}
/// <summary>
/// 设置图标状态
/// </summary>
private void SetIconScheduled(bool hasSchedule)
{
if (scheduleIcon != null && scheduleIconSprites != null && scheduleIconSprites.Length >= 2)
{
scheduleIcon.sprite = hasSchedule ? scheduleIconSprites[1] : scheduleIconSprites[0];
}
}
/// <summary>
/// 获取任务模式显示文本(支持多语言)
/// </summary>
private string GetModeText(ScheduleTaskMode mode)
{
string langKey = mode switch
{
ScheduleTaskMode.Standby => LANG_STANDBY,
ScheduleTaskMode.Scan => LANG_SCAN,
ScheduleTaskMode.Sterilize => LANG_ARMED,
_ => LANG_STANDBY
};
string defaultText = mode switch
{
ScheduleTaskMode.Standby => "Standby",
ScheduleTaskMode.Scan => "Scan",
ScheduleTaskMode.Sterilize => "Armed",
_ => "Standby"
};
return LanguageManager.Instance?.GetLanguage(langKey) ?? defaultText;
}
/// <summary>
/// 获取星期对应的标志位
/// </summary>
private byte GetDayFlag(DayOfWeek dayOfWeek)
{
return dayOfWeek switch
{
DayOfWeek.Monday => ScheduleTask.REPEAT_MONDAY,
DayOfWeek.Tuesday => ScheduleTask.REPEAT_TUESDAY,
DayOfWeek.Wednesday => ScheduleTask.REPEAT_WEDNESDAY,
DayOfWeek.Thursday => ScheduleTask.REPEAT_THURSDAY,
DayOfWeek.Friday => ScheduleTask.REPEAT_FRIDAY,
DayOfWeek.Saturday => ScheduleTask.REPEAT_SATURDAY,
DayOfWeek.Sunday => ScheduleTask.REPEAT_SUNDAY,
_ => 0
};
}
}
}