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 bool useFakeDataInEditor = true; private void OnEnable() { // 设置标志位,表示设置页面正在处理 _isSettingPageActive = true; // 订阅蓝牙事件 if (BLECommunicationManager.Instance != null) { BLECommunicationManager.Instance.OnScheduleTaskListReceived += OnScheduleTaskListReceived; } // 加载多语言 LoadLocalizedStrings(); // 绑定新增按钮事件 BindAddButton(); #if UNITY_EDITOR // 编辑器模式下使用假数据 if (useFakeDataInEditor) { Debug.Log("[ScheduleSettingPage] 编辑器模式:使用假数据"); LoadFakeData(); return; } #endif // 读取定时任务 ReadScheduleTasksFromBluetooth(); } 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); } } /// /// 加载假数据(用于编辑器测试) /// private void LoadFakeData() { var fakeTasks = new ScheduleTask[] { new ScheduleTask { TaskId = 0, Enabled = true, StartHour = 8, StartMinute = 0, EndHour = 12, EndMinute = 0, Mode = ScheduleTaskMode.Scan, Repeat = ScheduleTask.REPEAT_MONDAY | ScheduleTask.REPEAT_TUESDAY | ScheduleTask.REPEAT_THURSDAY }, new ScheduleTask { TaskId = 1, Enabled = true, StartHour = 14, StartMinute = 30, EndHour = 18, EndMinute = 0, Mode = ScheduleTaskMode.Sterilize, Repeat = ScheduleTask.REPEAT_WEDNESDAY | ScheduleTask.REPEAT_FRIDAY }, new ScheduleTask { TaskId = 2, Enabled = false, StartHour = 20, StartMinute = 0, EndHour = 22, EndMinute = 30, Mode = ScheduleTaskMode.Standby, Repeat = ScheduleTask.REPEAT_SATURDAY | ScheduleTask.REPEAT_SUNDAY }, new ScheduleTask { TaskId = 3, Enabled = true, StartHour = 6, StartMinute = 30, EndHour = 9, EndMinute = 0, Mode = ScheduleTaskMode.Scan, Repeat = ScheduleTask.REPEAT_MONDAY | ScheduleTask.REPEAT_TUESDAY | ScheduleTask.REPEAT_WEDNESDAY | ScheduleTask.REPEAT_THURSDAY | ScheduleTask.REPEAT_FRIDAY }, // 这个任务的开始和结束时间都是0,应该被过滤掉 new ScheduleTask { TaskId = 4, Enabled = false, StartHour = 0, StartMinute = 0, EndHour = 0, EndMinute = 0, Mode = ScheduleTaskMode.Standby, Repeat = 0 } }; // 过滤有效任务 var validTasks = FilterValidTasks(fakeTasks); UpdateScheduleUI(validTasks); Debug.Log($"[ScheduleSettingPage] 假数据加载完成,有效任务数: {validTasks.Length}"); } /// /// 从蓝牙读取定时任务 /// public void ReadScheduleTasksFromBluetooth() { 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) { 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); } } // 显示有效任务 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); } } 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