171 lines
5.5 KiB
C#
171 lines
5.5 KiB
C#
|
|
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)
|
|||
|
|
{
|
|||
|
|
// 检查任务是否启用且今天有重复
|
|||
|
|
if (task.Enabled && (task.Repeat & todayFlag) != 0)
|
|||
|
|
{
|
|||
|
|
int taskTime = task.StartHour * 60 + task.StartMinute;
|
|||
|
|
int timeDiff = taskTime - currentTime;
|
|||
|
|
|
|||
|
|
// 只找未来的任务(timeDiff > 0 表示任务时间在未来)
|
|||
|
|
if (timeDiff > 0 && timeDiff < nearestTimeDiff)
|
|||
|
|
{
|
|||
|
|
nearestTimeDiff = timeDiff;
|
|||
|
|
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)
|
|||
|
|
{
|
|||
|
|
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
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|