Files
classhelper-island-refactor…/analysis/features.md
T
ClassIsland Prompt Kit 22c1784bab feat: ClassIsland / ClassHelper 灵动岛提示词套件
- 重构版主提示词(14 parts,面向 ClassHelper 灵动岛重构)
- ClassIsland 全量规格提示词(20 parts,含分卷与逐章版本)
- 投喂指南、分卷、逐节文件
- 调研记录、一致性基线、生成与质检脚本
2026-11-12 21:59:58 +08:00

240 lines
28 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# features(Part 06/07/08)分析备注
负责人:features。产出:`parts/06-schedule-profile.md`、`parts/07-notifications.md`、`parts/08-automation.md`。
本文件记录:已读源文件清单、关键枚举/默认值表(供 Lead 汇总时交叉校验)、未决问题与缺口。全部为静态阅读结论,未构建、未运行、未截图。
## 1. 已读文件清单(相对 `D:\clword`)
### 1.1 档案 / 课表 / 时间表(Part 06)
| 文件 | 说明 / 关键行 |
|---|---|
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/Profile.cs` | 档案根模型(484 行):字段默认值 17-32,内置课表群 44-59,解散/删除群 104-137,科目编辑集合 139-217,临时层/临时课表/临时群 313-449,`OrderedSchedules` 468-477 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/ClassPlan.cs` | 课表(608 行):默认值 15-27,`ValidTimeLayoutItems` 双向裁剪 54-98,`RefreshClassesList` 451-491,`RefreshIsChangedClass` 496-513,`RemoveTimePointSafe` 515-522 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/TimeLayout.cs` | 时间表(298 行):默认名 17,增删时间点 188-235,`Layouts` 254-267 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/TimeLayoutItem.cs` | 时间点(256 行):Start/End 62-93,TimeType 文档 119-138,BreakName 175-191,ActionSet 196-205,CompareTo 212-241 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/ClassInfo.cs` | 课程项(122 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/Subject.cs` | 科目(141 行):自动 Initial 19-30,三个内置科目 79-101,复姓表 14、`GetFirstName` 107-140 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/TimeRule.cs` | 触发规则(70 行):默认 WeekDay=0 / Div=0 / DivTotal=2 |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/ClassPlanGroup.cs` | 课表群(50 行):两个内置 GUID |
| `repos/ClassIsland/ClassIsland.Shared/Models/Profile/OrderedSchedule.cs` | 预定课表(25 行) |
| `repos/ClassIsland/ClassIsland.Shared/Enums/TempClassPlanGroupType.cs` | Override / Inherit |
| `repos/ClassIsland/ClassIsland.Shared/Enums/TimeState.cs` | None/OnClass/PrepareOnClass/Breaking/AfterSchool |
| `repos/ClassIsland/ClassIsland/Services/LessonsService.cs` | 课程服务(646 行):50ms 计时器 39-45,课表选择 143-201,tick 主逻辑 373-527,`LoadCurrentClassPlan` 549-580,`CheckClassPlan` 582-607,周次计算 619-635,`GetClassIndex` 531-541 |
| `repos/ClassIsland/ClassIsland/Services/ProfileService.cs` | 档案服务(438 行):路径 34-53,集控合并 78-137,加载/保存 139-227,临时层 235-328,转正 335-360,临时群 362-415,信任 417-422 |
| `repos/ClassIsland/ClassIsland/Services/ProfileAnalyzeService.cs` | 对象图分析(212 行) |
| `repos/ClassIsland/ClassIsland/Views/ProfileSettingsWindow.axaml` | 档案编辑窗(2004 行):窗口参数 23-30,课表信息面板 53-140,时间表面板 202-232,临时课表/临时层 235-338,课表群 342-413,换课 Flyout 415-446,临时层 Flyout 448+ |
| `repos/ClassIsland/ClassIsland/Views/ProfileSettingsWindow.axaml.cs` | 交互逻辑(1671 行):`Open` 与页索引 186-262,保存于关闭 264-274,新增时间点 983-1099,调课 1414-1510,导入导出 1565-1668 |
| `repos/ClassIsland/ClassIsland/Views/ClassPlanDetailsWindow.axaml` | 课表详细信息窗(199 行) |
| `repos/ClassIsland/ClassIsland/Controls/TimeRuleEditControl.axaml` | 单双周/星期 Chip UI(54 行) |
| `repos/ClassIsland/ClassIsland/Controls/WeekOffsetSettingsControl.axaml.cs` | 轮换偏移正/反算(132 行) |
| `repos/ClassIsland/ClassIsland.Shared/Extensions/CsesExtensions.cs` | CSES 双向转换(167 行) |
| `repos/ClassIsland/ClassIsland/Controls/ProfileTransferProviders/CsesImportProvider.cs` | CSES 导入(72 行) |
| `repos/ClassIsland/ClassIsland/Controls/ProfileTransferProviders/ClassIsland1ImportProvider.cs` | 1.x 导入(58 行) |
| `repos/ClassIsland/ClassIsland/Views/ExcelImportWindow.xaml.cs` | **整文件 `#if false`(1 行处),WPF 遗留**(824 行) |
| `repos/ClassIsland/ClassIsland/Views/ExcelExportWindow.xaml.cs` | **整文件 `#if false`(1-539 行)** |
| `repos/ClassIsland/ClassIsland/App.Services.xaml.cs` | 注册表:窗口 109/145/148/198/204,提醒提供方 198-202,触发器 240-251,规则 253-267,行动 269-276,导入导出 292-296 |
### 1.2 提醒(Part 07)
| 文件 | 说明 / 关键行 |
|---|---|
| `repos/ClassIsland/ClassIsland/Services/NotificationHostService.cs` | 提醒主机(542 行):优先队列 41,提供方注册 79-114,Setup 128-155,Show 157-176,入队 178-191,链式 205-254,渠道注册 273-284,取消全部 322-335,推送/弹出 337-419,消费者注册 436-470,重新入队 488-522 |
| `repos/ClassIsland/ClassIsland/Services/NotificationWorkerService.cs` | 播放会话(250 行):设置三层覆盖 109-124,计时 82-107,语音/音效 178-208,状态机 211-234 |
| `repos/ClassIsland/ClassIsland.Core/Models/Notification/NotificationRequest.cs` | v2 请求(200 行) |
| `repos/ClassIsland/ClassIsland.Core/Models/Notification/NotificationContent.cs` | 内容与三个模板工厂(217 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Notification/NotificationPriority.cs` | 比较器(63 行,含 IsPriorityOverride 反常行为) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Notification/NotificationSettings.cs` | 提醒设置默认值(116 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Notification/NotificationProviderRegisterInfo.cs` | 提供方注册信息(57 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Notification/NotificationRequest.cs` | 旧版(`[Obsolete]`,249 行) |
| `repos/ClassIsland/ClassIsland.Core/Enums/Notification/NotificationState.cs` | 播放状态(32 行) |
| `repos/ClassIsland/ClassIsland.Shared/Enums/NotificationModes.cs` | Disabled/EnabledForce/Default |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/INotificationConsumer.cs` | 消费者契约 |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Services/NotificationProviders/NotificationProviderBase.cs` | 提供方基类(198 行) |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Services/NotificationProviders/NotificationChannel.cs` | 渠道(104 行) |
| `repos/ClassIsland/ClassIsland.Shared/Interfaces/INotificationProvider.cs` | 默认音效 Uri(37 行) |
| `repos/ClassIsland/ClassIsland.Core/Attributes/NotificationProviderInfo.cs` / `NotificationChannelInfo.cs` | 特性定义 |
| `repos/ClassIsland/ClassIsland/Services/NotificationProviders/ClassNotificationProvider.cs` | 上下课提醒(325 行) |
| `.../AfterSchoolNotificationProvider.cs` | 放学提醒(61 行) |
| `.../WeatherNotificationProvider.cs` | 天气提醒(173 行) |
| `.../ManagementNotificationProvider.cs` | 集控提醒(81 行) |
| `.../ActionNotificationProvider.cs` | 行动提醒(17 行,仅作为发送源) |
| `repos/ClassIsland/ClassIsland/Models/NotificationProviderSettings/ClassNotificationSettings.cs` | 上下课设置默认值(199 行) |
| `.../WeatherNotificationProviderSettings.cs` | 天气设置默认值(70 行) |
| `.../AfterSchoolNotificationProviderSettings.cs` | 放学设置默认值(33 行) |
| `repos/ClassIsland/ClassIsland.Controls/NotificationProviders/*.axaml` | 气泡内容布局:`ClassNotificationProviderControl.axaml`(104 行)、`AfterSchoolNotificationProvider.axaml`(30 行)、`WeatherNotificationProviderControl.axaml`(47 行) |
| `repos/ClassIsland/ClassIsland/Controls/MainWindowLine.cs` | 消费者与播放流程(815 行):`ReceiveNotifications` 639-656,模板键解析 658-665,中心点 667-680,`ProcessNotification` 682-811,`AcceptsNotificationRequests` 814 |
| `repos/ClassIsland/ClassIsland/Controls/MainWindowLine.axaml` | 行样式:`IslandContainerHeight=40`(16 行),进度绑定 77 |
| `repos/ClassIsland/ClassIsland/XamlThemes/FluentTheme/Styles.axaml` | 气泡模板与动画(120-197、275-449);`SlantedMaskControl` 参数 175-180 |
| `repos/ClassIsland/ClassIsland/XamlThemes/ClassicTheme/Styles.axaml` | 经典主题同类样式(136-330) |
| `repos/ClassIsland/ClassIsland/Controls/SlantedMaskControl.cs` | 斜切遮罩(346 行,含 5 区域权重与绘制) |
| `repos/ClassIsland/ClassIsland/Controls/NotificationEffects/RippleEffect.axaml(.cs)` | 强提醒涟漪(32/113 行) |
| `repos/ClassIsland/ClassIsland/Views/TopmostEffectWindow.axaml(.cs)` | 特效窗口(35/135 行),`UpdateWindowPos` 100-109 |
| `repos/ClassIsland/ClassIsland/ViewModels/TopmostEffectWindowViewModel.cs` | 特效控件集合(24 行) |
| `repos/ClassIsland/ClassIsland/MainWindow.axaml.cs` | 置顶锁 1056-1092,清除全部 1171-1174 |
| `repos/ClassIsland/ClassIsland/MainWindow.axaml` | 右键「清除全部提醒」86-94,行「此行可以显示提醒」425-433 |
| `repos/ClassIsland/ClassIsland/Views/ClearNotificationButtonWindow.xaml(.cs)` | **`#if false` 遗留,仅 15/18 行** |
| `repos/ClassIsland/ClassIsland/Services/AudioService.cs` | 音频设备共享与播放(143 行) |
| `repos/ClassIsland/ClassIsland/Services/SpeechService/SystemSpeechService.cs` | 系统 TTS 音量映射 |
| `.../EdgeTtsService.cs` | Edge TTS 音色/缓存/音量 |
| `repos/ClassIsland/ClassIsland/Views/SettingPages/NotificationSettingsPage.axaml` | 提醒设置页(497 行) |
### 1.3 自动化(Part 08)
| 文件 | 说明 / 关键行 |
|---|---|
| `repos/ClassIsland/ClassIsland/Services/AutomationService.cs` | 自动化服务(465 行):时间点行动 84-108,触发 112-133,恢复 138-167,配置加载 173-233,工作流加载 237-328,触发器加载 334-436 |
| `repos/ClassIsland/ClassIsland/Services/ActionService.cs` | 行动服务(277 行):Invoke/Revert/Interrupt 20-91,行动项执行 93-135,可变列表迭代 137-173,迁移 179-203,菜单树 208-260 |
| `repos/ClassIsland/ClassIsland/Services/RulesetService.cs` | 规则求值(163 行) |
| `repos/ClassIsland/ClassIsland/Services/WeatherService.cs` | 天气规则处理(460 行):规则注册 64-68,各规则 93-221,刷新与预警去重 236-403 |
| `repos/ClassIsland/ClassIsland/Services/WindowRuleService.cs` | 窗口规则处理(111 行) |
| `repos/ClassIsland/ClassIsland.Core/Models/Automation/Workflow.cs` | 工作流(33 行) |
| `.../TriggerSettings.cs` | 触发器设置(61 行) |
| `repos/ClassIsland/ClassIsland.Shared/Models/Automation/ActionSet.cs` | 行动组(128 行) |
| `.../ActionItem.cs` | 行动项(99 行) |
| `repos/ClassIsland/ClassIsland.Core/Models/Ruleset/{Ruleset,RuleGroup,Rule,StringMatchingSettings}.cs` | 规则集模型 |
| `repos/ClassIsland/ClassIsland.Core/Enums/RulesetLogicalMode.cs` | Or/And |
| `repos/ClassIsland/ClassIsland.Shared/Enums/ActionSetStatus.cs` | 4 状态 |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Automation/{TriggerBase,ActionBase}.cs` | 基类契约 |
| `repos/ClassIsland/ClassIsland.Core/Attributes/{TriggerInfo,ActionInfo}.cs` | 注册特性 |
| `repos/ClassIsland/ClassIsland/Services/Automation/Triggers/*.cs` | 12 个触发器(逐文件已读) |
| `repos/ClassIsland/ClassIsland/Services/Automation/Actions/*.cs` | 7 个行动(逐文件已读) |
| `repos/ClassIsland/ClassIsland/Models/Automation/Triggers/*.cs` | 5 个触发器设置模型 |
| `repos/ClassIsland/ClassIsland/Models/Actions/*.cs` | 6 个行动设置模型 |
| `repos/ClassIsland/ClassIsland/Models/Rules/*.cs` | 6 个规则设置模型 |
| `repos/ClassIsland/ClassIsland/Views/SettingPages/AutomationSettingsPage.axaml(.cs)` | 自动化设置页(402/167 行) |
| `repos/ClassIsland/ClassIsland/Models/Settings.cs` | 全局默认值(2655 行,按行号引用) |
## 2. 关键枚举 / 默认值总表(供交叉校验)
### 2.1 枚举
| 名称 | 值 | 证据 |
|---|---|---|
| `TimeLayoutItem.TimeType` | 0 上课 / 1 课间 / 2 分割线 / 3 行动 | `TimeLayoutItem.cs:120-138,246-253` |
| `TimeState` | 0 None / 1 OnClass / 2 PrepareOnClass(预留) / 3 Breaking / 4 AfterSchool | `TimeState.cs:6-27` |
| `TempClassPlanGroupType` | 0 Override / 1 Inherit | `TempClassPlanGroupType.cs:6-16` |
| `NotificationState` | None/Queued/Playing/Paused/Cancelled/Completed | `NotificationState.cs:6-31` |
| `NotificationModes` | Disabled=0 / EnabledForce=1 / Default=2 | `NotificationModes.cs:6-19` |
| `ActionSetStatus` | Normal / Invoking / IsOn / Reverting | `ActionSetStatus.cs:6-24` |
| `RulesetLogicalMode` | Or / And | `RulesetLogicalMode.cs:6-15` |
| `WindowStatusRuleSettings.State` | 0 正常 / 1 最大化 / 2 最小化 / 3 全屏(默认 1) | `WindowStatusRuleSettings.cs:7-27` |
| `RunActionRunType` | Application/Command/File/Folder/Url(字符串枚举) | `RunActionSettings.cs:19-49` |
| `WeatherNotificationActionSettings.NotificationKind` | 0 三天预报 / 1 预警 / 2 逐小时 | `WeatherNotificationActionSettings.cs:7` |
### 2.2 固定 GUID / ID
- 默认课表群 `ACAF4EF0-E261-4262-B941-34EA93CB4369`;全局课表群 `00000000-0000-0000-0000-000000000000`(`ClassPlanGroup.cs:44-49`)。
- 提醒提供方:上下课 `08F0D9C3-C770-4093-A3D0-02F3D90C24BC`、放学 `8FBC3A26-6D20-44DD-B895-B9411E3DDC51`、天气 `7625DE96-38AA-4B71-B478-3F156DD9458D`、集控 `0117fb4f-5374-434a-97fb-4f5374634a07`、行动 `4B12F124-8585-43C7-AFC5-7BBB7CBE60D6`。
- 渠道:准备上课 `CDDFE7FF-B904-4C73-B458-82793B2F66E9`、上课 `AFF5B9A4-037C-4A71-8563-C9EA87DDA75C`、下课 `77C9F3FB-0A2A-4B22-BDDF-3C333462B2F9`。
- 触发器 12 个 ID、行动 8 个 ID、规则 15 个 ID:见 Part 08 的表格(证据集中在 `App.Services.xaml.cs:240-276` 与各触发器/行动源文件)。
### 2.3 关键默认值(Part 06/07/08 交叉引用)
| 设置 | 默认 | 证据 |
|---|---|---|
| `SelectedProfile` | `"Default.json"` | Settings.cs:66 |
| `SingleWeekStartTime` | 今天所在周的周日 | Settings.cs:37-42 |
| `MultiWeekRotationMaxCycle` | 4 | Settings.cs:61 |
| `MultiWeekRotationOffset` | `[-1,-1,0,0,0]` | Settings.cs:60 |
| `DefaultOnClassTimePointMinutes` | 40 | Settings.cs:108 |
| `DefaultBreakingTimePointMinutes` | 10 | Settings.cs:109 |
| `ClassPrepareNotifySeconds` | 60 | Settings.cs:43 |
| `IsProfileEditorClassInfoSubjectAutoMoveNextEnabled` | true | Settings.cs:181 |
| `IsSwapMode` | true | Settings.cs:210 |
| `ExpIsExcelImportEnabled` | false | Settings.cs:113 |
| 档案窗口 | 1100×600,MinWidth 750 | ProfileSettingsWindow.axaml:27-28 |
| 课表详情窗口 | 800×500 | ClassPlanDetailsWindow.axaml:17 |
| `IsNotificationEnabled` | true | Settings.cs:91 |
| `AllowNotificationSpeech` | false | Settings.cs:153 |
| `AllowNotificationEffect` | true | Settings.cs:154 |
| `AllowNotificationSound` | false | Settings.cs:155 |
| `AllowNotificationTopmost` | true | Settings.cs:156 |
| `NotificationSoundVolume` | 1.0 | Settings.cs:182 |
| `SpeechVolume` | 1.0 | Settings.cs:136 |
| `EdgeTtsVoiceName` | `zh-CN-XiaoxiaoNeural` | Settings.cs:138 |
| `IsNotificationSoundEnabled`(全局兜底层) | true | Settings.cs:144 |
| `NotificationEffectRenderingScale` | 1.0 | Settings.cs:150 |
| `NotificationUseStandaloneEffectUiThread` | true | Settings.cs:1837 |
| `AnimationLevel` | 1 | Settings.cs:1851 |
| 遮罩/正文默认时长 | 5s / 5s | NotificationContent.cs:22-23 |
| 行高 `IslandContainerHeight` | 40 | MainWindowLine.axaml:16 |
| `IsAutomationEnabled` / `IsAutomationWarningVisible` / `CurrentAutomationConfig` | false / true / `"Default"` | Settings.cs:160-162 |
| `IsOnClassNotificationEnabled` 等三个上下课开关 | true | ClassNotificationSettings.cs:7-9 |
| 室内/户外提前量 | 60 / 600 秒 | ClassNotificationSettings.cs:10-11 |
| `WeatherAlertSpeed` | 7.0 | WeatherNotificationProviderSettings.cs:14 |
| 天气显示模式(预警/预报) | Disabled / Disabled | WeatherNotificationProviderSettings.cs:10-11 |
| 放学提醒 `IsEnabled` / `NotificationMsg` | true / `"今天的课程已结束,请同学们有序离开。"` | AfterSchoolNotificationProviderSettings.cs:9-10 |
| `NotificationActionSettings.MaskDurationSeconds` / `ContentDurationSeconds` | 5.0 / 10.0 | NotificationActionSettings.cs:14-15 |
| `SleepActionSettings.Value` | 5 秒 | SleepActionSettings.cs:6 |
| `PreTimePointTriggerSettings` | `TargetState=OnClass`, `TimeSeconds=60` | PreTimePointTriggerSettings.cs:9-11 |
| `CronTriggerSettings.CronExpression` | `"* * * * *"` | CronTriggerSettings.cs:7 |
| `ActionSet.Name` / `IsEnabled` / `IsRevertEnabled` | `"新行动组"` / true / false | ActionSet.cs:77-93 |
## 3. 未决问题 / 缺口(需 Lead 决策或后续补读)
1. **提醒优先级插队语义反常**:`NotificationPriority.CompareTo` 在 `IsPriorityOverride=true` 时返回 1(`NotificationPriority.cs:47-50`),在 .NET 最小堆中意味着**更晚**出队,与「紧急插队」直觉相反。Part 07 已按「显式定义 + 标注【推断】为历史取反问题」处理;若 Lead 要求逐位一致,需在总纲统一说明。
2. **`ClearNotificationButtonWindow` 为 `#if false` 遗留**:当前版本没有「清除提醒浮动按钮窗口」;Part 07 明确要求不得实现它,改用右键菜单「清除全部提醒」。若产品要求必须有,属新增功能。
3. **Excel 导入/导出整体被 `#if false` 屏蔽**(两个窗口 + DI 注册 + `ExpIsExcelImportEnabled=false`)。Part 06 已把它标为非首版必做,并给出【推断】格式建议;当前可用的导入导出是 CSES / ClassIsland 1.x / Class Widgets 1.2 / 导出 CSES(`App.Services.xaml.cs:292-296`)。
4. **「静音时段」不存在**:Settings 与提醒链路中没有任何免打扰时段字段,只有 `-q` 静默启动后 10 秒丢弃提醒(`MainWindowLine.cs:698-704`)。Part 07 已声明不得虚构,并给出可选扩展模型(标注【推断】)。
5. **强提醒渲染缩放自动推算公式缺失**:`IsNotificationEffectRenderingScaleAutoSet=true` 时的具体系数未在 `TopmostEffectWindow.cs` 中给出,Part 07 标【推断】。
6. **Class Widgets 1.2 导入转换逻辑未细读**:`ClassWidgetsProfileTransferHelper.cs` 尚未逐行阅读,Part 06 只按注册表与通用导入契约要求实现(文件名/流程/失败提示),未写字段映射细则。若需要像素级导入转换,需补读该文件。
7. **`ClassIslandV1ProfileTransferHelper` 与 `ClassWidgetsProfileTransferHelper`** 同样未逐行读;Part 06 只覆盖 CSES 的完整映射算法。
8. **时间线缩放常量缺失**:`ProfileSettingsWindow.axaml.cs` 的 ZoomIn/ZoomOut 只做 UI 事件,未读取具体缩放范围常量,Part 06 标【推断】为 0.5x–3x / 步长 0.1。
9. **档案 JSON 损坏的容错细节**:`ConfigureFileHelper.LoadConfig` 未逐行读,Part 06 要求「回退空档案 + 保留 .bak」并标【推断】。
10. **`ScheduleDataGrid` 单元格渲染细节**(科目简称/颜色/换课标记的视觉)未细读,Part 06 标【推断】,视觉规格建议归入 Part 04/05 由 ui-island 统一。
11. **`ProfileSettingsWindow.axaml` 的 2004 行中仅精读约 500 行**(结构、课表/时间表/临时/群/换课/导入导出区域)。剩余部分(约 900-1600 行为止的时间线列表模板、日程调整表格模板、附加设置项)只做了 outline 级 grep,像素细节若需要请 ui-island 或 windows part 补充。
12. **接口文件 `ILessonsService` / `IProfileService` 未逐行读**:只依据实现类与调用点推断契约;对外接口方法名(如 `GetCyclePositionsByDate`、`CreateTempClassPlan`)已在 Part 06 使用实现类签名表述。
13. **`ActionSetRunningControl` / `TriggerSettingsControl` / `ActionControl` / `RulesetControl` 的内部 UI 未精读**(仅确认存在与绑定方式),Part 08 只描述宿主页布局与行为契约;控件内部像素规格建议由 windows part 统一。
14. **天气图标模板 / WeatherInfo 数据结构**(`ClassIsland.Core/Models/Weather`)未展开,Part 07 只用到 `Alerts[].Title/Detail/Type/PubTime/Images`、`ForecastDaily.Weather/SunRiseSet`、`Minutely.Precipitation.RainRemainingMinutes`、`Current.Weather`、`UpdateTime`。若需要完整天气数据 schema,需补读该目录(可能属 Part 05 天气组件范围)。
15. **`GetSettingsDeltaTime` 的附加设置来源**:`ClassNotificationProvider` 使用 `IAttachedSettingsHostService`;附加设置体系(AttachedSettings)属跨 part 内容,Part 06/07 只按「按优先级取第一个启用项」描述,未定义完整附加设置模型,建议由 Lead 在总纲指定归属(可能在 Part 05 或 Part 13)。
## 3.1 裁决与修补(Lead 裁决,2026-11-12 修补轮)
本轮按 Lead 裁决修补 `parts/06`、`parts/07`、`parts/08`(不重写整篇),结论如下:
1. **Excel 导入/导出 = P1 必须实现**:用 `xlsx`(SheetJS)重建,禁止依赖 ReoGrid/WPF/OfficeOpenXml。ClassIsland 2.1 源码两个窗口整体 `#if false`,且 `ExcelImportViewModel`/`ExcelExportViewModel` 类型在仓库中**已不存在**(全仓检索无命中,属不可编译骨架),只能作布局参考。向导 UI 归 Part 11;Part 06 已新增 `6.9.1` 定义列格式、映射算法、往返一致性、预检规则与导出参数默认值(默认值标【推断】)。CSES 导入/导出标 **P0**。
2. **ClearNotificationButtonWindow**:维持「不实现(`#if false` 遗留)」,清除提醒统一用右键菜单「清除全部提醒」→ `CancelAllNotifications`。
3. **静音时段**:维持「ClassIsland 2.1 不存在、不得虚构」;可选扩展模型改为明确 **P2、默认关闭**,并要求命中时段时只屏蔽音效/语音/置顶/特效、不丢弃提醒。
4. **NotificationPriority = 最终确定语义**:排序键 `(提供方优先级下标升序) → (Level: Emergency>High>Normal>Low) → (入队序号升序)`;新增 `NotificationLevel` 字段(默认 `Normal`);记录原比较器 `IsPriorityOverride` 取反的反常行为并声明按语义修正;旧字段兼容映射(读入 true→Emergency,写出 High/Emergency→true)。Part 07 §7.2 已删除互相矛盾的「逐位一致」表述。
5. **附加设置 AttachedObjects = 2.x 现役机制**:`ClassIsland.Shared/AttachableSettingsObject.cs:15` 定义 `Dictionary<Guid, object?> AttachedObjects`;2.x `AttachedSettingsControlPresenter` 读取 `:241`、回写 `:361`。Part 06 新增 §6.10(定义/注册表 GUID/读取优先级/写回纪律/1.7 兼容/与档案分析关系/边界),Part 07 补全提醒侧的数据来源、GUID 与字段。**注意**:实际继承 `AttachableSettingsObject` 的是 `ClassPlan/ClassInfo/TimeLayout/TimeLayoutItem/Subject`;`Profile` 不继承(`Profile.cs:14`),故附加设置不能挂档案根——已在 §6.10.1 按源码写明。
6. **天气服务**:Part 07 末尾新增 §7.14(刷新/缓存、定位与城市来源、完整 JSON schema、预警去重、图标主题、断网降级与重试、消费方分工、验收)。数据源证据为 `Services/WeatherService.cs` 全文、`ClassIsland.Core/Models/Weather/*` 全部 18 个模型、`IWeatherService`、`ILocationService`、`WeatherSettingsPage.axaml`、`Assets/XiaomiWeather/xiaomi_weather_status.json`。
7. **其余未细读项**(Class Widgets 1.2 / ClassIsland 1.x 导入 helper 的字段映射、`ScheduleDataGrid` 单元格视觉)按要求**保持【推断】**,本轮不补读。
8. 原 §3 第 3、4、14、15 条已被上述裁决覆盖/关闭;第 1 条已由裁决 4 关闭;第 5、8、9、10、11、12、13 条仍为开放缺口,保留原描述。
### 3.1.1 本轮补读文件清单(新增证据)
| 文件 | 用途 |
|---|---|
| `repos/ClassIsland/ClassIsland.Shared/AttachableSettingsObject.cs`(62 行) | `AttachedObjects` 字段 15、`GetAttachedObject` 23-32、写入 39-42、默认值重载 51-61 |
| `repos/ClassIsland/ClassIsland.Shared/Interfaces/IAttachedSettings.cs`(40 行) | `IsAttachSettingsEnabled` 与 `GetIsEnabled`(含 JsonElement 兼容) |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Services/IAttachedSettingsHostService.cs`(44 行) | 4 个注册集合(14-22)、`GetAttachedSettingsByPriority` 24-43 |
| `repos/ClassIsland/ClassIsland/Services/AttachedSettingsHostService.cs`(13 行) | 实例侧集合 |
| `repos/ClassIsland/ClassIsland.Core/Attributes/AttachedSettingsControlInfo.cs` / `AttachedSettingsUsage.cs` | 注册特性(GUID/名称/图标/hasEnabledState/targets) |
| `repos/ClassIsland/ClassIsland.Core/Enums/AttachedSettingsTargets.cs` / `AttachedSettingsControlState.cs` | Flags 目标值、节点状态 Disabled/Enabled/Override |
| `repos/ClassIsland/ClassIsland.Core/Controls/AttachedSettingsControlPresenter.axaml.cs`(421 行) | 读取 241、目标类型映射 245-253、状态提示 272-341、写回纪律 354-362 |
| `repos/ClassIsland/ClassIsland/Helpers/AttachedSettingsControlHelper.cs`(69 行) | 控件侧读写 helper |
| `repos/ClassIsland/ClassIsland/Controls/AttachedSettingsControls/*.axaml.cs`(4 个) | 4 个附加设置的 GUID/名称/图标/targets/hasEnabledState |
| `repos/ClassIsland/ClassIsland/Models/AttachedSettings/{ClassNotification,AfterSchoolNotification,WeatherNotification}.cs`、`ClassIsland.Core/Models/AttachedSettings/LessonControlAttachedSettings.cs` | 附加设置模型与默认值 |
| `repos/ClassIsland/ClassIsland/Models/AttachedSettingsNodeWithState.cs` | 节点+状态模型 |
| `repos/ClassIsland/doc/AttachedSettings.md`(88 行) | 官方优先级说明 Subject→TimeLayoutItem→ClassPlan→TimeLayout(50-57) |
| `repos/ClassIsland/ClassIsland.Core/Models/Weather/*.cs`(18 个,36+23+22+14+9+8+40+9+8+18+33+29+21+9+12+10+32 行) | 天气完整 schema 与派生字段 |
| `repos/ClassIsland/ClassIsland.Core/Abstractions/Services/IWeatherService.cs`、`ClassIsland.Platforms.Abstractions/Services/ILocationService.cs` | 天气服务契约、定位契约 |
| `repos/ClassIsland/ClassIsland/Views/SettingPages/WeatherSettingsPage.axaml`(327 行) | 城市搜索/位置设置/图标包/排除预警/不使用 TLS 的 UI 文案 |
| `repos/ClassIsland/ClassIsland/Assets/XiaomiWeather/xiaomi_weather_status.json` | 天气码→中文文案表(0-35、53、301、302、99) |
| `repos/ClassIsland/ClassIsland/Views/ExcelImportWindow.xaml.cs`(824 行,`#if false`) | 时间点解析正则/数字个数 422-458、自动补课间 502-522、科目 Contains 匹配 587-639、完成导入 695-708 |
| `repos/ClassIsland/ClassIsland/Views/ExcelExportWindow.xaml.cs`(539 行,`#if false`) | 星期名 340-350、单元格生成 352-473、列宽/行高/边框 446-472、保存/打开 486-516 |
## 4. 与其他 part 的边界约定(避免重复/冲突)
- 窗口/控件像素级细节:主界面行、组件、主题样式以 Part 04/05/03 为准;本三篇只给与业务强相关的数值(气泡动画、斜切遮罩、特效窗口、课表窗口尺寸),并已注明来源,便于交叉核对。
- 数据存储路径、备份、迁移、Settings/Profile JSON schema 总表:Part 13;本三篇给出的是业务字段语义与默认值,字段名保持一致(`Actions` 而非 `ActionItems`、`ClassPlans`、`OrderedSchedules` 等)。
- 动画总表:Part 14;本三篇提供气泡/涟漪的时长与曲线原始值,建议 Part 14 直接引用本节,勿另行估算。
- 设置中心页面树:Part 10;本三篇只描述「提醒」「自动化」两页的结构与文案,页面注册顺序由 Part 10 统一。
- **Excel 导入/导出向导 UI 归 Part 11**;数据契约/列格式/往返一致性/预检以 Part 06 §6.9.1 为准,Part 11 只做步骤机与表单,不得另定格式。
- **附加设置模型(AttachedObjects)以 Part 06 §6.10 为唯一事实源**;Part 05(组件)/Part 13(存储 schema)如需引用,必须沿用同名字段与同一优先级链,不得另立模型。
- **天气服务与数据模型以 Part 07 §7.14 为准**;Part 05 的天气组件只消费 `LastWeatherInfo` 与 `SelectedWeatherIconTemplate`,不得自行请求或另定义 schema。
- 提醒优先级语义(三级排序键 + `NotificationLevel`)以 Part 07 §7.2 为准,Part 08 的「显示提醒」行动与集控提醒都按此映射,不得各自定义顺序。