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 modeKeys = new List { "100094", "100095", "100096" }; List modeStrs = new List(); List weekStr = new List(); List weekStrKeys = new List { "100130", "100124", "100125", "100126", "100127", "100128", "100129" }; // 定时任务UI列表 public OneSchedule[] scheduleItems; // 编辑页面 public ScheduleEditPage scheduleEditPage; // 新增按钮 public Button addButton; public Button closeBtn; // 缓存的定时任务列表 private List _scheduleTasks = new List(); // 最大任务数量 private const int MAX_SCHEDULE_COUNT = 5; // 页面关闭回调(用于通知主页更新) public System.Action OnPageClosed; // 静态标志:是否有设置页面正在处理回调 private static bool _isSettingPageActive = false; public GameObject noTip; private void OnEnable() { // 设置标志位,表示设置页面正在处理 _isSettingPageActive = true; // 订阅蓝牙事件 if (BLECommunicationManager.Instance != null) { BLECommunicationManager.Instance.OnScheduleTaskListReceived += OnScheduleTaskListReceived; } // 加载多语言 LoadLocalizedStrings(); // 绑定新增按钮事件 BindAddButton(); // 读取定时任务 ReadScheduleTasks(); } private void OnDisable() { // 取消订阅蓝牙事件 if (BLECommunicationManager.Instance != null) { BLECommunicationManager.Instance.OnScheduleTaskListReceived -= OnScheduleTaskListReceived; } // 清除标志位 _isSettingPageActive = false; // 通知主页更新定时任务状态 OnPageClosed?.Invoke(); } /// /// 检查是否有设置页面正在处理回调 /// public static bool IsSettingPageActive() { return _isSettingPageActive; } /// /// 加载多语言字符串 /// 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); } } /// /// 读取定时任务 /// public async void ReadScheduleTasks() { if (DataManager.Instance.hasWifi && !DataManager.Instance.hasBluetooth) { 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(); foreach (var d in DataManager.Instance.scheduleTaskDatas) { // 过滤开始时间和结束时间都为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 }); } 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]); } } /// /// 收到定时任务列表回调 /// private void OnScheduleTaskListReceived(ScheduleTaskListResponse response) { // 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]); } }); } /// /// 过滤有效任务 /// 规则:开始时间和结束时间都为0的任务视为无效,从列表中剔除 /// 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; } /// /// 更新定时任务UI /// 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(); } /// /// 刷新定时任务UI项 /// private void RefreshScheduleItems() { if (scheduleItems == null) { Debug.LogWarning("[ScheduleSettingPage] scheduleItems 未设置"); return; } // 隐藏所有项 foreach (var item in scheduleItems) { if (item != null) { item.gameObject.SetActive(false); } } 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); noTip.SetActive(false); } } Debug.Log($"[ScheduleSettingPage] UI已更新,显示 {_scheduleTasks.Count} 个任务"); } /// /// 绑定新增按钮事件 /// 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(); }); } } /// /// 新增按钮点击 /// 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 未设置"); } } /// /// 绑定任务项点击事件 /// private void BindItemClick(OneSchedule item, int index) { // 获取按钮组件(假设 OneSchedule 有 Button 或者在父物体上) Button button = item.GetComponent