642 lines
22 KiB
C#
Raw Normal View History

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Kill.Bluetooth;
using Kill.Bluetooth.Protocol;
using Kill.Core;
using Kill.Managers;
using Kill.UI.Components;
using UnityEngine;
using UnityEngine.UI;
namespace Kill.UI.Pages
{
public class ScheduleSettingPage : MonoBehaviour
{
// 多语言Key
List<string> modeKeys = new List<string> { "100094", "100095", "100096" };
List<string> modeStrs = new List<string>();
List<string> weekStr = new List<string>();
List<string> weekStrKeys = new List<string> { "100130", "100124", "100125", "100126", "100127", "100128", "100129" };
// 定时任务UI列表
public OneSchedule[] scheduleItems;
// 编辑页面
public ScheduleEditPage scheduleEditPage;
// 新增按钮
public Button addButton;
public Button closeBtn;
// 缓存的定时任务列表
private List<ScheduleTask> _scheduleTasks = new List<ScheduleTask>();
// 最大任务数量
private const int MAX_SCHEDULE_COUNT = 5;
// 页面关闭回调(用于通知主页更新)
public System.Action OnPageClosed;
// 静态标志:是否有设置页面正在处理回调
private static bool _isSettingPageActive = false;
2026-06-08 08:55:10 +08:00
public GameObject noTip;
private void OnEnable()
{
// 设置标志位,表示设置页面正在处理
_isSettingPageActive = true;
// 订阅蓝牙事件
if (BLECommunicationManager.Instance != null)
{
BLECommunicationManager.Instance.OnScheduleTaskListReceived += OnScheduleTaskListReceived;
}
// 加载多语言
LoadLocalizedStrings();
// 绑定新增按钮事件
BindAddButton();
// 读取定时任务
2026-06-17 15:42:55 +08:00
ReadScheduleTasks();
}
private void OnDisable()
{
// 取消订阅蓝牙事件
if (BLECommunicationManager.Instance != null)
{
BLECommunicationManager.Instance.OnScheduleTaskListReceived -= OnScheduleTaskListReceived;
}
// 清除标志位
_isSettingPageActive = false;
// 通知主页更新定时任务状态
OnPageClosed?.Invoke();
}
/// <summary>
/// 检查是否有设置页面正在处理回调
/// </summary>
public static bool IsSettingPageActive()
{
return _isSettingPageActive;
}
/// <summary>
/// 加载多语言字符串
/// </summary>
private void LoadLocalizedStrings()
{
modeStrs.Clear();
foreach (var key in modeKeys)
{
modeStrs.Add(LanguageManager.Instance?.GetLanguage(key) ?? key);
}
weekStr.Clear();
foreach (var key in weekStrKeys)
{
weekStr.Add(LanguageManager.Instance?.GetLanguage(key) ?? key);
}
}
/// <summary>
2026-06-17 15:42:55 +08:00
/// 读取定时任务
/// </summary>
2026-06-17 15:42:55 +08:00
public async void ReadScheduleTasks()
{
2026-06-17 15:42:55 +08:00
if (DataManager.Instance.hasWifi && !DataManager.Instance.hasBluetooth)
{
2026-06-17 15:42:55 +08:00
Debug.Log("[ScheduleSettingPage] WiFi模式读取定时任务...");
await DataManager.Instance.GetScheduleTasks(DataManager.Instance.selectedDevice.device_sn);
Debug.Log($"[ScheduleSettingPage] WiFi获取到 {DataManager.Instance.scheduleTaskDatas.Count} 条原始数据");
// 将API数据转换为ScheduleTask过滤全0无效任务
var tasks = new List<ScheduleTask>();
foreach (var d in DataManager.Instance.scheduleTaskDatas)
{
2026-06-17 15:42:55 +08:00
// 过滤开始时间和结束时间都为0的无效任务与BLE过滤规则一致
bool isInvalid = d.start_hour == 0 && d.start_minute == 0 &&
d.end_hour == 0 && d.end_minute == 0;
if (isInvalid)
{
Debug.Log($"[ScheduleSettingPage] WiFi过滤无效任务 ID={d.task_id}");
continue;
}
tasks.Add(new ScheduleTask
{
TaskId = d.task_id,
Enabled = d.enabled,
StartHour = d.start_hour,
StartMinute = d.start_minute,
EndHour = d.end_hour,
EndMinute = d.end_minute,
Mode = (ScheduleTaskMode)System.Enum.Parse(typeof(ScheduleTaskMode), d.mode, true),
Repeat = d.repeat_mask
});
}
2026-06-17 15:42:55 +08:00
Debug.Log($"[ScheduleSettingPage] WiFi有效任务数: {tasks.Count}");
UpdateScheduleUI(tasks.ToArray());
return;
}
if (BLECommunicationManager.Instance != null && BluetoothManager.Instance.IsConnected)
{
Debug.Log("[ScheduleSettingPage] 开始读取定时任务...");
// 显示Loading
LoadingUI.Show();
BLECommunicationManager.Instance.ReadScheduleTasks();
}
else
{
Debug.LogWarning("[ScheduleSettingPage] 蓝牙未连接,无法读取定时任务");
// 显示空列表
UpdateScheduleUI(new ScheduleTask[0]);
}
}
/// <summary>
/// 收到定时任务列表回调
/// </summary>
private void OnScheduleTaskListReceived(ScheduleTaskListResponse response)
{
2026-06-17 15:42:55 +08:00
// WiFi模式下忽略BLE回调
if (DataManager.Instance.hasWifi && !DataManager.Instance.hasBluetooth)
{
Debug.Log("[ScheduleSettingPage] WiFi模式下忽略BLE定时任务回调");
return;
}
Loom.QueueOnMainThread(() =>
{
Debug.Log($"[ScheduleSettingPage] 收到定时任务列表,状态: {response.Status}");
// 隐藏Loading
LoadingUI.Hide();
if (response.IsSuccess)
{
// 过滤有效任务开始时间和结束时间都为0的任务视为无效
var validTasks = FilterValidTasks(response.Tasks);
UpdateScheduleUI(validTasks);
}
else
{
Debug.LogError($"[ScheduleSettingPage] 读取定时任务失败,状态码: {response.Status}");
UpdateScheduleUI(new ScheduleTask[0]);
}
});
}
/// <summary>
/// 过滤有效任务
/// 规则开始时间和结束时间都为0的任务视为无效从列表中剔除
/// </summary>
private ScheduleTask[] FilterValidTasks(ScheduleTask[] tasks)
{
if (tasks == null || tasks.Length == 0)
{
return new ScheduleTask[0];
}
var validTasks = tasks.Where(task =>
{
// 检查开始时间和结束时间是否都为0
bool isInvalid = task.StartHour == 0 && task.StartMinute == 0 &&
task.EndHour == 0 && task.EndMinute == 0;
if (isInvalid)
{
Debug.Log($"[ScheduleSettingPage] 过滤无效任务 ID={task.TaskId}: 开始时间和结束时间都为0");
}
return !isInvalid;
}).ToArray();
Debug.Log($"[ScheduleSettingPage] 原始任务数: {tasks.Length}, 有效任务数: {validTasks.Length}");
return validTasks;
}
/// <summary>
/// 更新定时任务UI
/// </summary>
private void UpdateScheduleUI(ScheduleTask[] tasks)
{
_scheduleTasks.Clear();
if (tasks != null)
{
// 最多只取5个任务
int count = Mathf.Min(tasks.Length, MAX_SCHEDULE_COUNT);
for (int i = 0; i < count; i++)
{
_scheduleTasks.Add(tasks[i]);
}
}
// 更新UI显示
RefreshScheduleItems();
}
/// <summary>
/// 刷新定时任务UI项
/// </summary>
private void RefreshScheduleItems()
{
if (scheduleItems == null)
{
Debug.LogWarning("[ScheduleSettingPage] scheduleItems 未设置");
return;
}
2026-06-08 08:55:10 +08:00
// 隐藏所有项
foreach (var item in scheduleItems)
{
if (item != null)
{
item.gameObject.SetActive(false);
}
}
2026-06-08 08:55:10 +08:00
noTip.SetActive(true);
// 显示有效任务
for (int i = 0; i < _scheduleTasks.Count && i < scheduleItems.Length; i++)
{
int index = i; // 捕获索引用于回调
var task = _scheduleTasks[i];
var item = scheduleItems[i];
if (item != null)
{
item.gameObject.SetActive(true);
string modeText = GetModeText(task.Mode);
string repeatText = GetRepeatText(task.Repeat);
// 使用 OneSchedule 的 Init 方法初始化
item.Init(index, task, modeText, repeatText, OnSwitchValueChanged);
// 绑定点击事件(用于编辑)
BindItemClick(item, index);
2026-06-08 08:55:10 +08:00
noTip.SetActive(false);
}
}
Debug.Log($"[ScheduleSettingPage] UI已更新显示 {_scheduleTasks.Count} 个任务");
}
/// <summary>
/// 绑定新增按钮事件
/// </summary>
private void BindAddButton()
{
if (addButton != null)
{
addButton.onClick.RemoveAllListeners();
addButton.onClick.AddListener(OnAddButtonClick);
// 根据任务数量显示/隐藏新增按钮
addButton.gameObject.SetActive(_scheduleTasks.Count < MAX_SCHEDULE_COUNT);
}
if (closeBtn != null)
{
closeBtn.onClick.RemoveAllListeners();
closeBtn.onClick.AddListener(() =>
{
ClosePage();
});
}
}
/// <summary>
/// 新增按钮点击
/// </summary>
private void OnAddButtonClick()
{
Debug.Log("[ScheduleSettingPage] 点击新增任务");
if (scheduleEditPage != null)
{
scheduleEditPage.gameObject.SetActive(true);
scheduleEditPage.Init(-1, new ScheduleTask(), OnTaskSaved, null);
}
else
{
Debug.LogError("[ScheduleSettingPage] ScheduleEditPage 未设置");
}
}
/// <summary>
/// 绑定任务项点击事件
/// </summary>
private void BindItemClick(OneSchedule item, int index)
{
// 获取按钮组件(假设 OneSchedule 有 Button 或者在父物体上)
Button button = item.GetComponent<Button>();
if (button == null)
{
button = item.GetComponentInChildren<Button>(true);
}
if (button != null && button != item.isOnSwitch?.GetComponent<Button>())
{
button.onClick.RemoveAllListeners();
int taskIndex = index;
button.onClick.AddListener(() => OnItemClick(taskIndex));
}
2026-06-08 08:55:10 +08:00
}
/// <summary>
/// 任务项点击(进入编辑)
/// </summary>
private void OnItemClick(int taskIndex)
{
if (taskIndex < 0 || taskIndex >= _scheduleTasks.Count)
{
Debug.LogWarning($"[ScheduleSettingPage] 无效的任务索引: {taskIndex}");
return;
}
Debug.Log($"[ScheduleSettingPage] 点击编辑任务 {taskIndex}");
if (scheduleEditPage != null)
{
var task = _scheduleTasks[taskIndex];
scheduleEditPage.gameObject.SetActive(true);
scheduleEditPage.Init(taskIndex, task, OnTaskSaved, OnTaskDeleted);
}
else
{
Debug.LogError("[ScheduleSettingPage] ScheduleEditPage 未设置");
}
}
/// <summary>
/// 任务保存回调
/// </summary>
private void OnTaskSaved(ScheduleTask task, int taskIndex)
{
if (taskIndex < 0)
{
// 新增任务
if (AddScheduleTask(task))
{
Debug.Log($"[ScheduleSettingPage] 新增任务成功");
}
}
else
{
// 编辑任务
if (taskIndex < _scheduleTasks.Count)
{
_scheduleTasks[taskIndex] = task;
RefreshScheduleItems();
Debug.Log($"[ScheduleSettingPage] 编辑任务 {taskIndex} 成功");
}
}
// 保存到设备
SaveScheduleTasks();
// 更新新增按钮状态
if (addButton != null)
{
addButton.gameObject.SetActive(_scheduleTasks.Count < MAX_SCHEDULE_COUNT);
}
}
/// <summary>
/// 任务删除回调
/// </summary>
private void OnTaskDeleted(int taskIndex)
{
RemoveScheduleTask(taskIndex);
SaveScheduleTasks();
// 更新新增按钮状态
if (addButton != null)
{
addButton.gameObject.SetActive(_scheduleTasks.Count < MAX_SCHEDULE_COUNT);
}
}
/// <summary>
/// 开关状态变化回调
/// </summary>
private void OnSwitchValueChanged(int taskIndex, bool isOn)
{
if (taskIndex < 0 || taskIndex >= _scheduleTasks.Count)
{
Debug.LogWarning($"[ScheduleSettingPage] 无效的任务索引: {taskIndex}");
return;
}
// 更新任务状态
var task = _scheduleTasks[taskIndex];
task.Enabled = isOn;
_scheduleTasks[taskIndex] = task;
Debug.Log($"[ScheduleSettingPage] 任务 {taskIndex} 开关状态变更为: {(isOn ? "" : "")}");
// 保存到设备
SaveScheduleTasks();
}
/// <summary>
/// 获取模式显示文本
/// </summary>
private string GetModeText(ScheduleTaskMode mode)
{
int index = mode switch
{
ScheduleTaskMode.Standby => 0,
ScheduleTaskMode.Scan => 1,
ScheduleTaskMode.Sterilize => 2,
_ => 0
};
if (index >= 0 && index < modeStrs.Count)
{
return modeStrs[index];
}
return mode.ToString();
}
/// <summary>
/// 获取重复时间显示文本
/// </summary>
private string GetRepeatText(byte repeat)
{
// 没有重复时返回空字符串
if (repeat == 0)
{
return string.Empty;
}
// 检查是否7天都重复
byte allDays = ScheduleTask.REPEAT_SUNDAY | ScheduleTask.REPEAT_MONDAY | ScheduleTask.REPEAT_TUESDAY |
ScheduleTask.REPEAT_WEDNESDAY | ScheduleTask.REPEAT_THURSDAY | ScheduleTask.REPEAT_FRIDAY |
ScheduleTask.REPEAT_SATURDAY;
if (repeat == allDays)
{
return LanguageManager.Instance?.GetLanguage("100138") ?? "Everyday"; // 每天
}
var days = new List<string>();
if ((repeat & ScheduleTask.REPEAT_SUNDAY) != 0) days.Add(weekStr[0]); // Sun
if ((repeat & ScheduleTask.REPEAT_MONDAY) != 0) days.Add(weekStr[1]); // Mon
if ((repeat & ScheduleTask.REPEAT_TUESDAY) != 0) days.Add(weekStr[2]); // Tue
if ((repeat & ScheduleTask.REPEAT_WEDNESDAY) != 0) days.Add(weekStr[3]); // Wed
if ((repeat & ScheduleTask.REPEAT_THURSDAY) != 0) days.Add(weekStr[4]); // Thu
if ((repeat & ScheduleTask.REPEAT_FRIDAY) != 0) days.Add(weekStr[5]); // Fri
if ((repeat & ScheduleTask.REPEAT_SATURDAY) != 0) days.Add(weekStr[6]); // Sat
return string.Join(", ", days);
}
/// <summary>
/// 获取当前任务列表
/// </summary>
public List<ScheduleTask> GetScheduleTasks()
{
return _scheduleTasks;
}
/// <summary>
/// 添加新任务
/// </summary>
public bool AddScheduleTask(ScheduleTask task)
{
if (_scheduleTasks.Count >= MAX_SCHEDULE_COUNT)
{
Debug.LogWarning($"[ScheduleSettingPage] 任务数量已达上限 {MAX_SCHEDULE_COUNT}");
return false;
}
_scheduleTasks.Add(task);
RefreshScheduleItems();
return true;
}
/// <summary>
/// 删除任务
/// </summary>
public void RemoveScheduleTask(int index)
{
if (index >= 0 && index < _scheduleTasks.Count)
{
_scheduleTasks.RemoveAt(index);
RefreshScheduleItems();
}
}
/// <summary>
/// 保存定时任务到设备
/// 有效数据放在前面后面补全0数据
/// </summary>
2026-06-17 15:42:55 +08:00
public async void SaveScheduleTasks()
{
2026-06-17 15:42:55 +08:00
if (DataManager.Instance.hasWifi && !DataManager.Instance.hasBluetooth)
{
LoadingUI.Show();
var tasksToSave = new List<ScheduleTask>();
2026-06-17 17:46:30 +08:00
for (int i = 0; i < _scheduleTasks.Count && i < MAX_SCHEDULE_COUNT; i++)
2026-06-17 15:42:55 +08:00
{
var task = _scheduleTasks[i];
task.TaskId = (byte)i;
tasksToSave.Add(task);
}
2026-06-17 17:46:30 +08:00
// 补齐到5个任务空任务用全0填充与BLE保持一致
while (tasksToSave.Count < MAX_SCHEDULE_COUNT)
{
tasksToSave.Add(new ScheduleTask
{
TaskId = (byte)tasksToSave.Count,
Enabled = false,
StartHour = 0,
StartMinute = 0,
EndHour = 0,
EndMinute = 0,
Mode = ScheduleTaskMode.Standby,
Repeat = 0
});
}
2026-06-17 15:42:55 +08:00
await HomePageCtrl.Instance?.SaveScheduleTasksAsync(tasksToSave);
LoadingUI.Hide();
return;
}
if (BLECommunicationManager.Instance != null && BluetoothManager.Instance.IsConnected)
{
// 显示Loading
LoadingUI.Show();
// 创建保存列表重新设置TaskId
var tasksToSave = new List<ScheduleTask>();
// 先添加有效任务重新分配TaskId0-4
for (int i = 0; i < _scheduleTasks.Count && i < MAX_SCHEDULE_COUNT; i++)
{
var task = _scheduleTasks[i];
task.TaskId = (byte)i;
tasksToSave.Add(task);
}
// 补齐到5个任务空任务用全0填充
while (tasksToSave.Count < MAX_SCHEDULE_COUNT)
{
tasksToSave.Add(new ScheduleTask
{
TaskId = (byte)tasksToSave.Count,
Enabled = false,
StartHour = 0,
StartMinute = 0,
EndHour = 0,
EndMinute = 0,
Mode = ScheduleTaskMode.Standby,
Repeat = 0
});
}
Debug.Log($"[ScheduleSettingPage] 保存定时任务,有效任务数: {_scheduleTasks.Count},总任务数: {tasksToSave.Count}");
BLECommunicationManager.Instance.WriteScheduleTasks(tasksToSave.ToArray(), (success) =>
{
Loom.QueueOnMainThread(() =>
{
// 隐藏Loading
LoadingUI.Hide();
if (success)
{
Debug.Log("[ScheduleSettingPage] 定时任务保存成功");
}
else
{
Debug.LogError("[ScheduleSettingPage] 定时任务保存失败");
}
});
});
}
else
{
Debug.LogWarning("[ScheduleSettingPage] 蓝牙未连接,无法保存定时任务");
}
}
/// <summary>
/// 关闭页面
/// </summary>
public void ClosePage()
{
LoadingUI.Hide();
Destroy(gameObject);
}
}
}