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

200 lines
6.6 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>
2026-05-18 08:42:33 +08:00
/// 查找今天启用的任务(返回最近的一个未结束任务)
/// </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;
int endTime = task.EndHour * 60 + task.EndMinute;
// 跳过已结束的任务
if (currentTime >= endTime)
continue;
int timeDiff = taskTime - currentTime;
// 找距离当前时间最近的任务(包括进行中的和未来未开始的)
int absTimeDiff = Math.Abs(timeDiff);
if (absTimeDiff < nearestTimeDiff)
{
2026-05-18 08:42:33 +08:00
nearestTimeDiff = absTimeDiff;
nearestTask = task;
}
}
return nearestTask;
}
/// <summary>
/// 显示任务信息
/// </summary>
private void DisplayTask(ScheduleTask task)
{
string modeText = GetModeText(task.Mode);
string timeText = $"{task.StartHour:D2}:{task.StartMinute:D2}";
2026-05-18 08:42:33 +08:00
// 判断任务是未来还是进行中
int currentTime = DateTime.Now.Hour * 60 + DateTime.Now.Minute;
int taskTime = task.StartHour * 60 + task.StartMinute;
bool isFutureTask = taskTime > currentTime;
if (scheduleText != null)
{
2026-05-18 08:42:33 +08:00
if (isFutureTask)
{
// 即将开始的任务
scheduleText.text = $"{modeText}: {timeText}";
}
else
{
// 任务进行中,显示时间段
scheduleText.text = $"{modeText}: {timeText}~{task.EndHour:D2}:{task.EndMinute:D2}";
}
}
}
/// <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
};
}
}
}