# 时记 TaskChron 终局设计文档 v2.0

> 版本：v2.0 | 日期：2026-06-12 | 定位：Windows 桌面端任务记录工具（终局版本）
> 原则：终局导向，拒绝渐进式扩展；所有架构面向最终目标一次性设计到位

---

<!-- 章节占位：修订说明 -->
## 修订说明

### 一、从 v1.1 到 v2.0 的核心变更

| 变更类别 | v1.1 问题 | v2.0 修正 |
|----------|----------|-----------|
| **范围裁剪** | 包含 Android 端、跨平台同步、移动端适配 | **仅保留 Windows 桌面端**；Android 相关设计全部删除；同步方案降级为"本地备份+为跨端预留接口" |
| **数据模型重构** | DailyReport/WeeklyReport 直接存储 `Task[]` 数组，数据冗余严重；Contact 嵌套在 Task 中；缺少独立联系人/项目/设置/日志/语音/模板实体 | 全部关系型规范化：独立 `contacts` / `projects` / `settings` / `activity_logs` / `voice_records` / `task_templates` 表；日报/周报**不存储任务副本**，通过 `date_range` 查询 Task 表动态生成 |
| **交互矛盾修正** | "自动保存（无确认按钮）"与新建浮层有取消/确认按钮矛盾；行内编辑保存机制不明确 | 统一规则：**浮层新建 = 确认后保存**；**行内编辑 = 失焦/Enter 即时保存**；**托盘快捷新建 = 直接保存** |
| **缺失功能补全** | 缺少回收站、批量操作、数据备份恢复、导入、高级搜索、任务模板、快捷键系统完整设计 | 全部补全为终局设计的一部分 |
| **技术选型锁定** | 模糊提及 Tauri v2 同时支持 Android | **锁定 Tauri v2 仅编译 Windows 目标**；同步层预留 `SyncAdapter` 接口但不实现；语音识别锁定 Web Speech API |
| **开发里程碑重构** | 里程碑是渐进式扩展（MVP -> v0.2 -> ...） | 改为**终局架构内的分阶段实现**，每个阶段产出可独立运行，架构支持后续阶段无缝叠加 |

### 二、v1.1 问题清单与修正方案

#### 问题 1：数据模型反规范化（高严重）
- **现象**：DailyReport.completed / WeeklyReport.completed 存储 `Task[]` 数组，任务修改后日报数据不同步
- **根因**：日报/周报被设计为"数据快照"而非"视图查询"
- **Fix**：DailyReport / WeeklyReport 仅存储元数据（日期范围、发送状态、用户编辑的亮点/计划文本）。任务列表通过 `WHERE completedAt BETWEEN ? AND ?` 实时查询 Task 表生成。日报内容=查询结果+用户编辑文本的合并渲染

#### 问题 2：Contact 嵌套导致无法做对接人历史统计（高严重）
- **现象**：Contact 是 Task 的嵌套对象，无法查询"和张三合作过多少任务"
- **根因**：对接人被当作任务属性而非独立实体
- **Fix**：抽取独立 `contacts` 表，Task 通过 `contact_id` 外键关联。支持对接人档案（姓名、部门、备注、合作次数统计）

#### 问题 3：缺少独立的操作日志/审计追踪（中严重）
- **现象**：用户误删任务、修改节点时间后无法追溯
- **根因**：v1.1 无日志实体
- **Fix**：新增 `activity_logs` 表，记录所有增删改操作（时间、类型、旧值、新值）。日志视图从中查询渲染

#### 问题 4：语音识别原始文本丢失（中严重）
- **现象**：语音转写后 NLP 解析出错，用户无法回溯原始语音内容
- **根因**：无语音记录存储
- **Fix**：新增 `voice_records` 表，保存原始转写文本、解析结果、用户修正后的最终值。支持"语音历史"查看和重新解析

#### 问题 5：项目/分类是字符串而非实体（中严重）
- **现象**：`project: string` 导致拼写不一致、无法做项目级统计、无法归档项目
- **根因**：项目被当作标签而非实体
- **Fix**：新增 `projects` 表（id, name, color, archived, createdAt）。Task 通过 `project_id` 外键关联

#### 问题 6：缺少用户设置持久化表（中严重）
- **现象**：提醒时间、推送渠道、主题偏好等设置无存储位置
- **Fix**：新增 `settings` 表（key-value 结构），覆盖所有可配置项

#### 问题 7：自动保存逻辑矛盾（低严重）
- **现象**：流程图写"自动保存（无确认按钮）"，但线框图有取消/确认按钮
- **Fix**：明确三种新建路径的不同保存策略（见交互流程章节）

#### 问题 8：节点提醒触发机制不明确（低严重）
- **现象**："节点前 N 分钟弹出提醒"但 N 的值、触发器实现、重复提醒策略均未定义
- **Fix**：在 settings 中定义 `reminder_advance_minutes`（默认 15），由 Rust 后端定时轮询（每分钟一次），通过 Tauri notification API 发送系统 Toast

#### 问题 9：周视图拖拽后数据更新机制缺失（低严重）
- **现象**：拖拽任务跨日"自动修改节点时间"，但未说明修改的是哪个 node（任务有多个 nodes）
- **Fix**：周视图中每个任务卡片仅显示其"最近节点"或"被拖拽指定的节点"。拖拽时弹出轻量确认"将节点时间改为 X 月 X 日？"，确认后更新该 node 的 time 字段

#### 问题 10：导出字段映射未定义（低严重）
- **现象**："按日期/项目/对接人 多 sheet 维度"但未列出具体字段
- **Fix**：在导出方案章节中明确定义 Excel/Word 的字段映射和模板结构

### 三、v2.0 新增 10 个设计提升点

| # | 提升点 | 说明 | 所在章节 |
|---|--------|------|----------|
| 1 | **任务快速模板** | 预置常用任务模板（会议、评审、周报、联调），一键填充标题/节点类型/默认优先级 | 数据模型：`task_templates` 表 |
| 2 | **批量操作模式** | 任务列表进入多选状态，支持批量完成/批量修改优先级/批量删除/批量移动项目 | 界面状态：状态 J |
| 3 | **回收站与撤销** | 删除任务先进回收站（保留 30 天），支持单条恢复和清空。行内编辑按 `Ctrl+Z` 撤销上次修改 | 数据模型：`deleted_at` 字段；交互流程 |
| 4 | **高级搜索面板** | 支持按日期范围、项目、对接人、优先级、状态、关键词组合过滤，搜索结果可导出 | 界面状态：状态 K |
| 5 | **数据备份/恢复** | 一键导出完整 SQLite 数据库为 `.taskchron` 备份文件；支持从备份文件恢复 | 技术架构：BackupManager |
| 6 | **快捷键系统完整映射** | 所有操作均有快捷键，支持在设置中自定义（存储于 settings 表） | 界面状态；技术架构 |
| 7 | **托盘图标状态感知** | 托盘图标根据当前状态变化：正常/有即将到期节点/有过期节点/有进行中任务，通过颜色/角标区分 | 界面状态：状态 C 补充 |
| 8 | **节点到时自动过期标记** | 节点时间超过当前时间且任务未完成的，自动标记为"过期"（红色高亮），无需用户手动设置 | 交互流程：工作进行中 |
| 9 | **日报/周报 Markdown 预览+编辑** | 自动生成 Markdown 后，用户可在双栏视图（左侧 Markdown / 右侧 实时预览）中编辑，确认后发送 | 界面状态：状态 H/I 补充 |
| 10 | **任务完成趋势图** | 月历视图底部增加 ECharts 迷你折线图，展示本月每日完成任务数趋势 | 界面状态：状态 G 补充 |

<!-- 章节占位：终局信息架构 -->
## 一、终局信息架构

### 1.1 系统架构图（Windows 桌面端唯一）

```
+-------------------------------------------------------------+
|                    Windows 系统托盘区域                        |
|  +---------+  +---------+  +-----------------------------+  |
|  | 时记    |  | 右键菜单 |  | 全局快捷键监听（Rust 后端）  |  |
|  | 左键展开 |  | 快捷操作 |  |  Ctrl+Shift+T / R / S ...   |  |
|  +---------+  +---------+  +-----------------------------+  |
+-------------------------------------------------------------+
                              |
              +---------------+---------------+
              |               |               |
              v               v               v
    +-----------------+ +----------+  +-------------+
    |   悬浮展开态     | | 悬浮收起态 |  |  托盘右键菜单  |
    |  (主交互界面)    | | (迷你浮窗) |  |  (快捷操作)   |
    +-----------------+ +----------+  +-------------+
                              |
                              v
    +-----------------------------------------------------+
    |                   数据层（本地唯一）                    |
    |  +----------+  +------------+  +-----------------+  |
    |  | SQLite   |  |  Settings  |  |  Backup/Export  |  |
    |  | (主存储)  |  |  (配置持久化)|  |  (.taskchron)   |  |
    |  +----------+  +------------+  +-----------------+  |
    |                                                      |
    |  【预留】SyncAdapter 接口（为后续跨端预留，当前不实现）  |
    |  interface SyncAdapter { sync(), pull(), push() }    |
    +-----------------------------------------------------+
```

### 1.2 视图层级与导航结构

> **v0.5.0 更新**：桌面端主窗口已从原来的「左侧 Sidebar + 单主内容区」重设计为**四栏布局**，并简化为「任务 / 视图 / 日志」三大主 Tab。设置与用户管理改为从头像菜单打开的独立窗体。

主窗口采用以下四栏结构（从左到右）：

1. **Rail（48px）**：固定最左侧，包含圆角矩形头像菜单与「任务」「视图」「日志」三个主 Tab 图标。
2. **Group Panel（默认 200px，可拖拽 160–320px）**：根据当前主 Tab 渲染分组。
   - **任务 Tab**：时间分组（所有/今天/最近7天/收集箱/已完成/垃圾桶）、清单（项目）、标签、对接人。
   - **视图 Tab**：日程视图、日视图、周视图、月视图、年视图。
   - **日志 Tab**：全部操作、按类型筛选、按日期筛选、导出日志。
3. **Task List Panel（flex-1）**：任务 Tab 下展示当前分组任务列表，顶部有常驻新建任务输入条；视图 Tab 下渲染对应日历视图；日志 Tab 下展示操作日志列表。
4. **Detail Panel（默认 360px，可折叠）**：任务 Tab 下展示选中任务的完整详情，包括标题、时间、优先级、描述清单、多标签、子任务、附件等。

**设置**与**用户管理**不再位于主内容区，而是通过 Rail 顶部头像菜单分别打开 `SettingsWindow` / `UsersWindow` 独立窗体。

浮层/弹窗叠加在主窗口之上，不切换路由，包括：日报/周报预览浮层、导出配置浮层、语音输入浮层、对接人档案浮层、批量操作浮层、搜索过滤浮层、快捷键参考浮层。任务新建主要使用第三栏顶部的常驻输入条；原有的独立「快速新建浮层」作为托盘/全局快捷键入口保留。

<!-- 章节占位：界面状态 -->
## 二、所有 Windows 桌面端界面状态（A-M）

### 状态 A：悬浮收起态（Mini Widget）

- **尺寸**: 180x120px（固定，不可 resize）
- **位置**: 屏幕右侧边缘（x = 屏幕宽 - 180, y = 屏幕高/2 - 60），可垂直拖拽调整 y 坐标，记忆最后位置
- **圆角**: 12px（左侧两角 12px，右侧两角 0px，贴合边缘）
- **阴影**: 0 4px 20px rgba(0,0,0,0.15)
- **背景**: #FFFFFF（浅色）/ #1E1E2E（深色）
- **布局**: 顶部当前时间（等宽 13px）-> 今日进度条（148x4px，已完成=#0DBF9C）-> 下一个待办标题（14px，截断 8 字）-> 倒计时（时钟青，等宽）
- **交互**: 单击展开为状态 B；hover 右上角淡入 "+" 按钮点击直接打开新建浮层；右键打开托盘菜单；垂直拖拽吸附左/右边缘；双击标题区打开周视图

### 状态 B：悬浮展开态（Full Panel - 主界面）

> **v0.5.0 更新**：主界面从「左侧 Sidebar + 单内容区」改为四栏布局，导航简化为「任务 / 视图 / 日志」三大 Tab。

- **尺寸**: 1050x800px（默认），最小 520x420px，最大 1400x1000px（用户可拖拽 resize，记忆尺寸）
- **位置**: 从收起态展开时左侧对齐；独立打开时记忆上次位置
- **Header**: 44px 高，左侧品牌图标+"时记"（18px,600），中间日期（13px,#6B7280），右侧最小化/最大化/关闭/搜索/置顶按钮
- **四栏布局**:
  - **Rail（48px）**：固定最左侧，包含圆角矩形头像菜单与「任务」「视图」「日志」三个主 Tab 图标；当前 Tab 左侧 3px #0DBF9C 竖条+背景高亮。
  - **Group Panel（默认 200px，可拖拽 160–320px）**：按当前 Tab 渲染分组列表；任务 Tab 下分时间/清单/标签/对接人，视图 Tab 下分五种视图模式，日志 Tab 下分筛选/导出。
  - **Task List Panel（flex-1）**：任务 Tab 下展示当前分组任务列表，顶部有常驻新建任务输入条；视图 Tab 下渲染对应日历视图；日志 Tab 下展示操作日志。
  - **Detail Panel（默认 360px，可折叠）**：任务 Tab 下展示选中任务详情；其他 Tab 下可折叠以腾出空间。
- **任务卡片**: 内边距 12px 16px，圆角 8px，边框 1px #E5E7EB，hover 边框色变为 #0DBF9C40。过期态左侧 3px 红条+背景 #FEF2F2；完成态文字灰色+删除线
- **行内编辑**: 点击任意字段进入编辑态。标题 Enter 保存 Esc 取消；时间/对接人/项目/优先级选择器即时保存；Tab 切换字段 Shift+Tab 反向；Ctrl+Z 撤销；失焦即保存（除备注 Enter 换行）
- **即将到期面板**: 背景 #FEF3C7，按剩余时间升序排序，点击定位到主列表对应任务

### 状态 C：托盘右键菜单

- **尺寸**: 240px 宽，高度自适应
- **位置**: 托盘图标左上方对齐
- **内容**: 品牌栏（不可点击）-> 今日工作统计信息 -> 分隔线 -> 快速新建工作 -> 分隔线 -> 立即发送日报/周报 -> 分隔线 -> 打开本周/月历视图 -> 分隔线 -> 打开备份文件夹 -> 分隔线 -> 设置 -> 退出时记
- **托盘图标状态**: 正常=青色时钟；有进行中=绿色小圆点；即将到期(<30min)=橙色；过期=红色+角标数字；全部完成=灰色

### 状态 D：行内编辑模式（嵌入任务卡片）

各字段编辑态：标题输入框（autoFocus, Enter 保存, Esc 取消）、时间 DateTimePicker、对接人下拉搜索（支持新建）、项目下拉选择（支持新建）、优先级四级单选按钮组、备注输入框（失焦保存, Enter 换行）。
Tab 顺序：标题 -> 时间 -> 对接人 -> 节点时间 -> 优先级 -> 备注。
保存反馈：成功显示绿色对勾 1.5s 淡出；失败边框变红+tooltip 说明原因。

### 状态 E：新建任务浮层（Quick Capture）

- **尺寸**: 480x440px（固定）
- **位置**: 屏幕中央，遮罩 rgba(0,0,0,0.4)
- **字段**: 工作内容（autoFocus, 占位符"做什么工作？", 支持 NLP）、对接人（下拉搜索+新建按钮）、节点时间（日期+时间+类型选择：截止/里程碑/提醒）、所属项目（下拉+新建）、紧急度（紧急/高/正常/低，默认正常）
- **快速模板**: [会议][评审][周报][联调] 一键填充预设字段
- **按钮**: [取消] [确认新建]
- **键盘**: Ctrl+Enter 确认，Esc 取消，Tab 字段导航，全局 Ctrl+Shift+T 直接打开
- **NLP**: 输入后 800ms 无新输入自动触发解析，成功自动填充对应字段并高亮边框提示"已自动填充"

### 状态 E-Voice：语音输入浮层

- **尺寸**: 480x480px（固定）
- **布局**: 标题栏含录音计时（红色圆点呼吸动画）-> 实时转写文本区 -> 音频波形可视化（CSS 动画条）-> 分隔线 -> 自动解析预览区 -> [取消][重新录制][确认]
- **交互**: 点击麦克风或 Ctrl+Shift+R 开始录音；点击停止/静默 2.5 秒自动停止/Esc 取消；识别中显示转圈；成功自动 NLP 解析；失败提示"未听清，请重试"+重试按钮；确认将结果回填状态 E

### 状态 F：本周视图（Week View）

- **尺寸**: 760x560px（默认），最小 640x440px，最大 1000x720px
- **布局**: Header 含周范围显示和 [<][>] 切换按钮 -> 左侧导航（同状态 B）-> 主区 7 列网格（周一至周日）-> 底部本周统计（完成/进行中/过期数量）
- **交互**: 拖拽任务卡片跨日移动（释放后弹出确认"将节点时间改为 X 月 X 日？"）；点击日期列头切换到该日今日视图；[<][>] 切换周次；点击任务卡片展开详情；[周]/[日] 切换视图模式；每列最多显示 4 个卡片，超出显示"+N 更多"

### 状态 G：月历视图（Month View）

- **尺寸**: 720x620px（默认），最小 600x500px，最大 960x760px
- **布局**: Header 含年月和 [<][>] 切换 -> 左侧导航 -> 主区 7xN 日历网格 -> 底部月度概览统计 -> 最底部 ECharts 迷你趋势图（本月每日完成任务数折线图）
- **日历格子**: 每个格子显示日期数字 + 最多 3 个彩色状态点（紧急红/高优先级橙/进行中黄/完成绿/过期红）。今日格子带 #0DBF9C 边框高亮
- **交互**: 点击日期格子切换到该日今日视图；点击状态点弹出当日任务列表面板；[<][>] 切换月份；hover 格子显示该日任务数 tooltip
- **月度概览**: 总任务数 / 完成数 / 进行中数 / 过期数 / 完成率百分比
- **趋势图**: 30 天折线图，x 轴日期，y 轴完成数，hover 显示具体数值

### 状态 H：日报预览浮层（Daily Report Preview）

- **尺寸**: 680x560px（固定）
- **布局**: 标题"日报预览 - 6月12日" -> 双栏视图：左侧 Markdown 源码编辑器、右侧实时渲染预览
- **内容自动生成**: 汇总今日已完成任务（标题+完成时间+备注），按项目分组，按对接人分组。未完成任务单独列出
- **用户可编辑**: Markdown 标题、任务列表、分组顺序、新增自定义文本段落
- **操作按钮**: [取消] [复制到剪贴板] [发送日报] [导出为 Word]
- **发送配置**: 发送前检查 settings 中的 wecom_webhook / wechat_webhook，若未配置提示"请先配置推送渠道"

### 状态 I：周报预览浮层（Weekly Report Preview）

- **尺寸**: 720x600px（固定）
- **布局**: 同日报双栏 Markdown 编辑器结构
- **内容自动生成**: 本周已完成（按日期分组，周一至周日）、本周进行中/未完成、本周亮点（自动提取+用户可编辑）、下周计划（基于未完成任务+用户自定义文本）
- **统计卡片**: 顶部显示本周完成数、进行中数、过期数、完成率
- **操作按钮**: [取消] [复制到剪贴板] [发送周报] [导出为 Word/Excel]
- **自动触发**: 每周五 17:00 自动弹出预览浮层（若 settings.auto_weekly_report=true）

### 状态 J：批量操作模式（Bulk Action）

- **触发**: 任务列表右上角点击"批量"按钮，或按 Ctrl+B
- **状态变化**: 每个任务卡片左侧出现复选框，任务项背景变为可勾选态
- **底部浮动操作栏**: 固定在主内容区底部，显示"已选择 N 项" + [标记完成] [修改优先级 >] [移动到项目 >] [删除] [取消]
- **交互**: 勾选多个任务 -> 操作栏实时显示选择数量 -> 点击操作弹出确认/下拉 -> 执行后刷新列表并退出批量模式 -> 显示 Toast
- **快捷键**: Ctrl+A 全选当前列表，Esc 退出批量模式

### 状态 K：高级搜索面板（Advanced Search）

- **尺寸**: 520x500px（固定）
- **位置**: 屏幕中央浮层
- **搜索条件**: 关键词（标题/备注模糊匹配）、日期范围（创建日期/节点日期/完成日期）、项目（多选下拉）、对接人（多选下拉）、优先级（多选）、状态（多选）
- **操作**: [重置条件] [搜索] [导出结果]
- **结果展示**: 下方展开搜索结果列表，显示"找到 N 条结果"
- **导出结果**: 直接打开导出配置浮层，预填充当前搜索条件为过滤范围

### 状态 L：设置窗体（Settings Window）

> **v0.5.0 更新**：设置不再位于主内容区 Tab，而是通过 Rail 头像菜单打开的独立窗体；用户管理（仅管理员）同样为独立窗体。

- **窗体标识**: `settings`
- **尺寸**: 800x600px（默认），最小 640x480px
- **布局**: 左侧分类列表 + 右侧内容区的独立面板；与用户管理窗体（`users`）风格一致
- **分类**:
  - **账号**: 用户资料、修改密码、已注册设备、退出登录
  - **外观**: 主题（浅色/深色/跟随系统）、主题色、字体大小
  - **提醒与通知**: 节点提醒提前时间（5/15/30/60 分钟，默认 15）、日报自动发送时间（默认 17:30）、周报自动发送（开关，默认周五 17:30）、提醒音效（开关）
  - **日期与时间**: 日期格式、周起始
  - **推送**: 企业微信 Webhook URL、微信测试号配置、发送前预览（开关）
  - **导出**: 默认导出路径、导出文件名模板
  - **数据**: 立即备份、从备份恢复、导入数据（支持从 Excel/CSV 导入）、清空回收站、数据保留策略（回收站保留天数，默认 30）
  - **快捷键**: 所有快捷键的自定义配置表格（操作名、默认快捷键、自定义快捷键、重置按钮）
  - **关于**: 版本号、开源协议、检查更新、打开日志文件夹
- **保存机制**: 每个设置项修改后即时保存到 settings 表，无需"保存"按钮

### 状态 L-2：用户管理窗体（Users Window）

- **窗体标识**: `users`
- **尺寸**: 900x640px（默认）
- **布局**: 左侧用户列表 + 右侧用户详情/编辑
- **入口**: 仅管理员在 Rail 头像菜单中可见
- **功能**: 查看同步账号、切换角色、启用/禁用账号、编辑联系方式、删除账号（禁止删除当前登录账号）

### 状态 M：对接人档案浮层（Contact Profile）

- **尺寸**: 400x480px（固定）
- **触发**: 点击任务卡片中的对接人名称，或从搜索/设置中打开
- **布局**: 顶部头像区（首字母+背景色）-> 姓名（18px,600）-> 部门（13px,#6B7280）-> 编辑备注区 -> 统计卡片（合作任务总数/已完成/进行中/过期）-> 最近合作任务列表（最近 5 条）-> [编辑信息] [查看全部任务]
- **交互**: 点击"查看全部任务"切换到今日视图并自动过滤该对接人；点击"编辑信息"进入行内编辑态

<!-- 章节占位：数据模型 -->
## 三、终局数据模型

### 3.1 实体关系图（ER Diagram）

```
projects (1) ----< (*) tasks (*) >---- (1) contacts
    |                |   |                |
    |                |   |                |
    |           nodes (*)               |
    |           (taskId FK)             |
    |                                   |
settings (1)                      daily_reports
activity_logs                     weekly_reports
voice_records                     task_templates
```

核心关系：
- `tasks` 通过 `contact_id` 关联 `contacts`（多对一）
- `tasks` 通过 `project_id` 关联 `projects`（多对一）
- `tasks` 通过 `id` 关联 `nodes`（一对多，一个任务可有多个时间节点）
- `tasks` 软删除机制：`deleted_at` 字段非 NULL 表示在回收站中
- `daily_reports` / `weekly_reports` 不存储任务副本，仅存储元数据和用户编辑文本

### 3.2 SQLite DDL（终局表结构）

```sql
-- 项目表
CREATE TABLE projects (
  id TEXT PRIMARY KEY,
  name TEXT NOT NULL UNIQUE,
  color TEXT DEFAULT '#0DBF9C',
  archived INTEGER DEFAULT 0,
  created_at INTEGER NOT NULL
);

-- 对接人表
CREATE TABLE contacts (
  id TEXT PRIMARY KEY,
  name TEXT NOT NULL,
  dept TEXT,
  remark TEXT,
  created_at INTEGER NOT NULL
);

-- 任务表（核心）
CREATE TABLE tasks (
  id TEXT PRIMARY KEY,
  title TEXT NOT NULL,
  status TEXT DEFAULT 'pending',
  priority TEXT DEFAULT 'normal',
  remark TEXT,
  contact_id TEXT REFERENCES contacts(id) ON DELETE SET NULL,
  project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
  created_at INTEGER NOT NULL,
  completed_at INTEGER,
  deleted_at INTEGER,
  updated_at INTEGER NOT NULL
);
CREATE INDEX idx_tasks_status ON tasks(status);
CREATE INDEX idx_tasks_contact ON tasks(contact_id);
CREATE INDEX idx_tasks_project ON tasks(project_id);
CREATE INDEX idx_tasks_created ON tasks(created_at);
CREATE INDEX idx_tasks_completed ON tasks(completed_at);
CREATE INDEX idx_tasks_deleted ON tasks(deleted_at) WHERE deleted_at IS NOT NULL;

-- 时间节点表（一个任务可有多个节点）
CREATE TABLE nodes (
  id TEXT PRIMARY KEY,
  task_id TEXT NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
  node_time INTEGER NOT NULL,
  node_type TEXT DEFAULT 'deadline',
  reminded INTEGER DEFAULT 0,
  created_at INTEGER NOT NULL
);
CREATE INDEX idx_nodes_task ON nodes(task_id);
CREATE INDEX idx_nodes_time ON nodes(node_time);
CREATE INDEX idx_nodes_reminded ON nodes(reminded, node_time);

-- 日报元数据表（不存储任务副本）
CREATE TABLE daily_reports (
  id TEXT PRIMARY KEY,
  report_date INTEGER NOT NULL UNIQUE,
  highlights TEXT,
  sent_at INTEGER,
  channel TEXT DEFAULT 'disabled',
  auto_send INTEGER DEFAULT 1,
  created_at INTEGER NOT NULL,
  updated_at INTEGER NOT NULL
);

-- 周报元数据表
CREATE TABLE weekly_reports (
  id TEXT PRIMARY KEY,
  week_start INTEGER NOT NULL,
  week_end INTEGER NOT NULL,
  highlights TEXT,
  next_week_plan TEXT,
  sent_at INTEGER,
  channel TEXT DEFAULT 'disabled',
  auto_send INTEGER DEFAULT 1,
  created_at INTEGER NOT NULL,
  updated_at INTEGER NOT NULL
);
CREATE UNIQUE INDEX idx_weekly_week ON weekly_reports(week_start);

-- 设置表（key-value）
CREATE TABLE settings (
  key TEXT PRIMARY KEY,
  value TEXT NOT NULL,
  updated_at INTEGER NOT NULL
);

-- 活动日志表（审计追踪）
CREATE TABLE activity_logs (
  id TEXT PRIMARY KEY,
  entity_type TEXT NOT NULL,
  entity_id TEXT NOT NULL,
  action TEXT NOT NULL,
  field TEXT,
  old_value TEXT,
  new_value TEXT,
  created_at INTEGER NOT NULL
);
CREATE INDEX idx_logs_entity ON activity_logs(entity_type, entity_id);
CREATE INDEX idx_logs_created ON activity_logs(created_at);

-- 语音记录表
CREATE TABLE voice_records (
  id TEXT PRIMARY KEY,
  raw_text TEXT NOT NULL,
  parsed_json TEXT,
  final_json TEXT,
  task_id TEXT REFERENCES tasks(id) ON DELETE SET NULL,
  created_at INTEGER NOT NULL
);

-- 任务模板表
CREATE TABLE task_templates (
  id TEXT PRIMARY KEY,
  name TEXT NOT NULL,
  title_template TEXT,
  node_type TEXT DEFAULT 'reminder',
  priority TEXT DEFAULT 'normal',
  project_id TEXT REFERENCES projects(id) ON DELETE SET NULL,
  sort_order INTEGER DEFAULT 0,
  created_at INTEGER NOT NULL
);
```

### 3.3 核心查询示例（日报/周报/导出数据映射）

**日报数据查询（给定日期 20260612）**:
```sql
-- 今日已完成
SELECT t.*, c.name as contact_name, p.name as project_name
FROM tasks t
LEFT JOIN contacts c ON t.contact_id = c.id
LEFT JOIN projects p ON t.project_id = p.id
WHERE date(t.completed_at / 1000, 'unixepoch') = '2026-06-12'
  AND t.status = 'done' AND t.deleted_at IS NULL
ORDER BY t.completed_at;

-- 今日进行中（含过期）
SELECT t.*, n.node_time, n.node_type,
       c.name as contact_name, p.name as project_name
FROM tasks t
LEFT JOIN nodes n ON t.id = n.task_id
LEFT JOIN contacts c ON t.contact_id = c.id
LEFT JOIN projects p ON t.project_id = p.id
WHERE t.status = 'pending' AND t.deleted_at IS NULL
ORDER BY n.node_time;
```

**周报数据查询（给定周一日期 20260609）**:
```sql
-- 本周已完成（周一至周日）
SELECT t.*, c.name as contact_name, p.name as project_name,
       date(t.completed_at/1000,'unixepoch') as completed_date
FROM tasks t
LEFT JOIN contacts c ON t.contact_id = c.id
LEFT JOIN projects p ON t.project_id = p.id
WHERE t.completed_at >= strftime('%s','2026-06-09')*1000
  AND t.completed_at < strftime('%s','2026-06-16')*1000
  AND t.status = 'done' AND t.deleted_at IS NULL
ORDER BY completed_date, t.completed_at;

-- 本周进行中/未完成
SELECT t.*, n.node_time, c.name as contact_name, p.name as project_name
FROM tasks t
LEFT JOIN nodes n ON t.id = n.task_id
LEFT JOIN contacts c ON t.contact_id = c.id
LEFT JOIN projects p ON t.project_id = p.id
WHERE t.status = 'pending' AND t.deleted_at IS NULL
ORDER BY n.node_time;
```

**Excel 导出字段映射**:
| 列名 | 来源字段 | 说明 |
|------|----------|------|
| 日期 | task.created_at / completed_at / node.node_time | 根据导出维度选择 |
| 工作内容 | task.title | |
| 对接人 | contacts.name | 左关联查询 |
| 部门 | contacts.dept | |
| 项目 | projects.name | 左关联查询 |
| 优先级 | task.priority | urgent/high/normal/low |
| 状态 | task.status | 进行中/已完成/已取消/已过期 |
| 节点时间 | nodes.node_time | 格式 yyyy-mm-dd HH:mm |
| 节点类型 | nodes.node_type | 截止/里程碑/提醒 |
| 完成备注 | task.remark | |
| 创建时间 | task.created_at | |
| 完成时间 | task.completed_at | 未完成时为空 |

<!-- 章节占位：交互流程 -->
## 四、完整闭环交互流程

### 4.1 主流程：从"收到新工作"到"日报/周报推送"到"导出"

```
[收到新工作通知]
       |
       v
[判断入口方式] -- 全局快捷键 Ctrl+Shift+T --> [打开状态 E：新建浮层]
     |                                           |
     +-- 托盘右键"快速新建" --> [打开状态 E]      |
     |                                           |
     +-- 悬浮收起态 hover 点击 "+" --> [打开状态 E]|
     |                                           |
     +-- 语音快捷键 Ctrl+Shift+R --> [打开状态 E-Voice]
     |                                           |
     v                                           v
[填写/语音录入工作内容]                        [语音识别]
     |                                           |
     | (支持 NLP 自动解析)                        |
     v                                           v
[用户确认/修正字段] <-- NLP 解析结果回填 --------+
     |
     v
[点击"确认新建" 或 Ctrl+Enter]
     |
     v
[系统：写入 SQLite tasks 表 + nodes 表]
[系统：写入 activity_logs 表（action=create）]
[系统：关闭浮层，显示 Toast "已新建：{标题}"]
[系统：刷新当前视图任务列表]
     |
     v
[工作进行中 -- 时间节点追踪循环]
     |
     +-- 悬浮收起态显示下一个节点倒计时
     +-- 每分钟 Rust 后端轮询 nodes 表
     |       +-- node_time - now <= reminder_advance_minutes
     |       |   AND reminded = 0
     |       |       --> 发送 Windows Toast 通知
     |       |       --> 更新 nodes.reminded = 1
     |       +-- node_time < now AND task.status = pending
     |               --> 任务卡片自动标记"过期"（红色高亮）
     +-- 用户行内编辑修改节点时间
     |       --> 即时保存到 nodes 表
     |       --> 记录 activity_logs（action=update, field=node_time）
     +-- 用户查看周视图/月历视图
     +-- 用户完成任务勾选
             |
             v
[勾选完成]
     |
     v
[系统：更新 task.status = 'done', task.completed_at = now()]
[系统：400ms 完成动画（划线+收缩）]
[系统：0.5s 延迟弹出备注输入条（轻量浮层）]
     |
     +-- 用户输入备注 --> [保存备注到 task.remark]
     |                      [记录 activity_logs]
     +-- 用户按 Esc 跳过 --> [备注保持为空]
     |
     v
[系统：任务移至"已完成"区域]
[系统：刷新今日进度条]
     |
     v
[日报/周报生成触发]
     |
     +-- 每日 17:25（默认，可配置）
     |       --> 查询当日 completed/pending 任务
     |       --> 生成 Markdown 草稿
     |       --> 若 auto_send=1：弹出状态 H（日报预览浮层）
     |       --> 用户确认/编辑后点击"发送日报"
     |               --> HTTP POST 到 wecom_webhook
     |               --> 更新 daily_reports.sent_at = now()
     |               --> Toast "日报已发送"
     |       --> 用户点击"取消"：不发送，记录为"已跳过"
     |
     +-- 每周五 17:00（默认，可配置）
             --> 查询本周 completed/pending 任务
             --> 按日期分组生成 Markdown
             --> 自动提取亮点（从备注中提取关键词）
             --> 基于未完成任务生成下周计划草稿
             --> 若 auto_send=1：弹出状态 I（周报预览浮层）
             --> 用户确认/编辑后点击"发送周报"
                     --> HTTP POST 到 wecom_webhook
                     --> 更新 weekly_reports.sent_at = now()
                     --> Toast "周报已发送"
             --> 用户点击"取消"：不发送，记录为"已跳过"
     |
     v
[导出触发（用户主动）]
     |
     +-- 用户点击"导出"或托盘菜单"导出"
     |       --> 打开导出配置浮层
     |       --> 选择：范围（月/周/自定义日期）+ 格式（Excel/Word）+ 维度（按日期/项目/对接人）
     |       --> 确认后前端生成文件
     |       --> Tauri fs API 保存到用户选择路径
     |       --> Toast "导出成功：{文件名}"
     |
     v
[闭环结束]
```

### 4.2 异常分支处理

| 异常场景 | 触发条件 | 系统响应 | 数据变化 | 界面状态 |
|----------|----------|----------|----------|----------|
| **语音识别失败** | Web Speech API 返回 error / 无识别结果 | 显示"未听清，请重试"红色提示 + [重试] 按钮 | 不写入任何数据 | 保持在状态 E-Voice |
| **NLP 解析失败** | 正则/规则匹配无结果 | 静默不提示，所有字段保持用户输入值 | 不写入数据 | 保持在状态 E |
| **节点已过期** | node_time < now() 且 task.status = pending | 任务卡片自动变红（左侧红条+背景 #FEF2F2），托盘图标变红 | 不自动改 status（保持 pending，用户可主动标记完成） | 今日视图刷新 |
| **日报/周报发送失败** | HTTP POST webhook 返回非 200 | Toast "发送失败：{错误信息}" + [重试] 按钮 | sent_at 不更新 | 保持在预览浮层 |
| **数据库写入失败** | SQLite 约束冲突/磁盘满 | 显示红色边框+tooltip"保存失败"，提供[重试] | 事务回滚，数据不变 | 保持在当前编辑态 |
| **误删任务** | 用户点击删除 | 任务移入回收站（deleted_at = now()），列表中消失 | task.deleted_at 更新 | Toast "已移至回收站，30 天后自动清除 [撤销]" |
| **撤销删除** | 点击 Toast 中的"撤销" | 恢复任务到列表（deleted_at = NULL） | task.deleted_at 重置 | 列表刷新，任务重现 |
| **回收站过期清理** | 启动时检查 deleted_at < now() - 30天 | 永久删除任务及关联 nodes、voice_records | DELETE FROM tasks WHERE deleted_at < ? | 后台静默执行 |
| **快捷键冲突** | 用户自定义快捷键与系统快捷键冲突 | 设置面板显示红色警告"该快捷键已被系统占用" | 不保存冲突值 | 保持在设置面板 |

### 4.3 三种新建路径的保存策略

| 路径 | 触发方式 | 保存策略 | 为什么这样设计 |
|------|----------|----------|----------------|
| **浮层新建（状态 E）** | Ctrl+Shift+T / 托盘菜单 / 收起态 "+" | 点击"确认新建"或 Ctrl+Enter 后一次性保存 | 浮层有多个字段需要用户确认，避免半成数据入库 |
| **行内新建** | 今日视图底部"快速添加"输入框 | 输入标题后按 Enter 即时保存，其他字段默认空 | 模仿 Todoist 的极简添加，降低摩擦 |
| **托盘快捷新建** | 未来扩展：托盘菜单直接输入（预留） | 直接保存（标题=输入内容，其他字段默认） | 托盘操作追求极致速度，无确认环节 |

<!-- 章节占位：技术架构 -->
## 五、技术架构与选型理由

### 5.1 技术选型决策

| 层级 | 选型 | 理由 | 终局支持能力 |
|------|------|------|--------------|
| **跨平台框架** | **Tauri v2** | Rust 后端性能高、包体<10MB、原生 Windows 系统集成深度（托盘、全局快捷键、通知） | 终局版本仅编译 Windows 目标 (`tauri build --target x86_64-pc-windows-msvc`)，但架构代码不排斥未来扩展 |
| **前端框架** | **React 18 + TypeScript** | 组件化适合复杂状态管理，类型安全避免数据模型错误传播到 UI | 支持所有界面状态和浮层的组件化拆分 |
| **状态管理** | **Zustand** | 轻量（<1KB），支持持久化中间件，无样板代码 | 存储当前视图状态、过滤条件、浮层显隐，不存储任务数据（任务数据走 SQLite） |
| **本地存储** | **SQLite** (`tauri-plugin-sql` 或 `libsql`) | 关系型查询支持日报/周报/导出的复杂 JOIN；单文件便于备份恢复 | 所有实体表统一 SQLite，支持完整 SQL 查询 |
| **UI 组件** | **Tailwind CSS + shadcn/ui** | shadcn 提供高质量可定制组件（Dialog, Dropdown, Calendar 等），Tailwind 支持深色模式（dark: 前缀） | 终局所有界面状态均可基于 shadcn 组件组合构建 |
| **日期处理** | **date-fns** | 纯函数、Tree-shakable、支持中文本地化 | 所有日期格式化、周/月计算、日期范围查询 |
| **Markdown** | **react-markdown + remark** | 日报/周报预览渲染 | 双栏编辑器右侧实时预览 |
| **图表** | **ECharts** | 月历视图底部趋势图、统计面板饼图/柱状图 | 趋势图、完成率可视化 |
| **导出 Excel** | **xlsx.js (SheetJS)** | 纯前端生成，无需后端服务 | 支持多 sheet、自定义样式、字段映射 |
| **导出 Word** | **docx.js** | 纯前端生成，支持段落/表格/标题样式 | 日报/周报 Word 导出，适合汇报 |
| **语音识别** | **Web Speech API** | Chromium 原生支持中文识别，桌面端零依赖 | 状态 E-Voice 的录音和转写 |
| **NLP 解析** | **自定义规则引擎** | 基于正则+中文分词（jieba-wasm 或简单规则），不依赖外部 API | 解析"明天下午3点和李四过方案"-> {title, contact, time, priority} |

### 5.2 模块依赖图

```
+------------------+
|   Tauri Rust     |
|  +-------------+ |
|  | TrayManager | |  <- 托盘图标状态、右键菜单
|  | ShortcutMgr | |  <- 全局快捷键注册/监听
|  | NotifTimer  | |  <- 每分钟轮询 nodes 表，触发 Toast
|  | BackupMgr   | |  <- 数据库备份/恢复
|  | WindowMgr   | |  <- 悬浮窗位置/尺寸记忆
|  +-------------+ |
+--------+---------+
         | IPC invoke
         v
+------------------+
|  React Frontend  |
|  +-------------+ |
|  | UI States   | |  <- 13 种界面状态（A-M）
|  | Zustand     | |  <- 视图状态、过滤条件、主题
|  | SQLite CRUD | |  <- tauri-plugin-sql 封装层
|  | ReportGen   | |  <- 日报/周报 Markdown 生成
|  | ExportEng   | |  <- Excel/Word 生成
|  | VoiceInput  | |  <- Web Speech API 封装
|  | NLPEngine   | |  <- 规则解析引擎
|  +-------------+ |
+------------------+
         |
         v
+------------------+
|   SQLite DB      |
|  (app_local_dir) |
+------------------+
```

### 5.3 关键技术实现路径

**悬浮窗与收起态**:
- Tauri `Window` API 创建主窗口（展开态），`alwaysOnTop: true`，`decorations: false`（自定义标题栏）
- 收起态是同一窗口的 resize 动画（从 640x540 动画到 180x120），或独立小窗口（根据性能测试决定）
- 窗口位置记忆：通过 Tauri `store` 插件或 settings 表持久化

**全局快捷键**:
- Rust 后端使用 `global_shortcut` 插件注册
- Ctrl+Shift+T -> 发送 IPC 事件到前端 -> 前端打开新建浮层
- Ctrl+Shift+R -> 打开语音输入浮层
- Ctrl+Shift+S -> 展开/收起主窗口

**节点提醒轮询**:
- Rust 后端启动时创建定时器（每分钟触发一次）
- 每次触发：查询 `SELECT * FROM nodes WHERE reminded = 0 AND node_time <= ?`（? = now + advance_minutes）
- 对每条结果：调用 `notification` 插件发送 Windows Toast，然后 `UPDATE nodes SET reminded = 1 WHERE id = ?`
- 应用启动时重置所有已过期提醒：`UPDATE nodes SET reminded = 0 WHERE node_time > ?`（防止重启后漏提醒）

**深色模式**:
- Tailwind `dark:` 前缀实现所有组件的深色样式
- settings 表存储 `theme: 'light' | 'dark' | 'system'`
- `system` 模式下监听 Windows 系统主题变化（Tauri OS 插件）

**数据备份/恢复**:
- 备份：复制 SQLite 数据库文件到用户选择的目录，后缀 `.taskchron`，文件名含时间戳
- 恢复：关闭当前数据库连接 -> 替换文件 -> 重新连接 -> 验证表结构版本 -> 刷新前端
- 自动备份：settings 中可配置每日/每周自动备份，保存到 `%APPDATA%/TaskChron/backups/`

<!-- 章节占位：推送导出 -->
## 六、微信/企微推送与导出方案

### 6.1 企业微信推送方案（主推）

**技术路径**: HTTP POST 到企业微信群机器人 Webhook URL

**配置方式**:
- 用户在设置面板 -> "推送" Tab 中输入企业微信机器人 Webhook URL
- 格式：`https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxx`
- 支持配置多个 Webhook（主群、项目组群），发送时可选目标

**消息格式（Markdown）**:
```json
{
  "msgtype": "markdown",
  "markdown": {
    "content": "**日报 - 2026年6月12日（周五）**\n\n---\n**今日完成（3项）**\n1. 需求评审会议（09:00-10:00）| 对接人：张三 | 产品部\n   > 已确认方案，下一步出原型\n2. 接口文档编写（14:00-17:00）| 对接人：李四 | 技术部\n3. 周报汇总（10:30）| 对接人：王五\n   > 已同步给主管，发给了全体组员\n\n---\n**进行中（1项）**\n- 接口联调 | 对接人：赵六 | 节点：明天 10:00\n\n---\n*由 时记 TaskChron 自动生成*"
  }
}
```

**周报消息格式**:
```json
{
  "msgtype": "markdown",
  "markdown": {
    "content": "**周报 - 6月9日~6月15日**\n\n**本周亮点**\n- 完成需求评审，方案已确认\n- 接口文档编写完成\n\n**本周完成（8项）**\n[按日期分组列出]\n\n**进行中（3项）**\n[列出]\n\n**下周计划**\n- 接口联调\n- 原型评审\n\n---\n*由 时记 TaskChron 自动生成*"
  }
}
```

**错误处理**:
- Webhook 返回非 200：Toast 提示"发送失败：{errmsg}" + [重试] 按钮
- 网络超时（5s）：提示"网络超时，请检查连接后重试"
- URL 未配置：预览浮层显示黄色警告条"未配置推送渠道，只能复制或导出"

### 6.2 微信推送方案（备选）

- 微信测试号/服务号需要接入微信 OAuth，流程复杂
- **终局方案**：仅支持企业微信 Webhook；若用户需要发送到微信，可手动复制日报内容到微信
- 预留 `channel` 字段值为 `wechat`，当前实现中若选择 wechat 则提示"请复制内容手动发送"

### 6.3 Excel 导出方案

**多 Sheet 维度**:

| Sheet 名称 | 维度 | 排序 | 分组 |
|------------|------|------|------|
| 按日期 | 日期 | 日期升序 | 按日期分组，每天一个区块 |
| 按项目 | 项目名 | 项目名升序 | 按项目分组 |
| 按对接人 | 对接人名 | 对接人名升序 | 按对接人分组 |
| 统计汇总 | - | - | 总任务数、完成数、各项目占比、各对接人占比 |

**文件命名模板**: `时记导出_{范围}_{日期}.xlsx`
示例：`时记导出_周报_20260609-20260615.xlsx`

**样式**: 表头浅灰背景+粗体，日期列格式 yyyy-mm-dd，时间列格式 HH:mm，状态列带颜色（完成=绿色背景，进行中=黄色，过期=红色）

### 6.4 Word 导出方案

**适用场景**: 日报/周报直接导出为 `.docx`，适合邮件附件或打印提交

**文档结构**:
1. 标题（Heading 1）：日报/周报 + 日期范围
2. 统计摘要（表格）：完成数、进行中数、过期数、完成率
3. 已完成工作（Heading 2）-> 每项工作为一个段落，含时间、对接人、项目、备注
4. 进行中工作（Heading 2）
5. 本周亮点（仅周报，Heading 2）
6. 下周计划（仅周报，Heading 2）
7. 页脚：由 时记 TaskChron 自动生成

**实现**: 使用 `docx.js` 在前端构建文档对象，通过 Tauri `fs:save` 对话框保存到本地。

<!-- 章节占位：开发计划 -->
## 七、详细开发阶段规划

> 原则：在终局架构内按功能依赖关系分阶段实现。每个阶段交付物可独立运行，架构支持后续阶段无缝叠加。

---

### 阶段一：基础骨架（第 1-2 周）

**目标**: 搭建可运行的 Tauri v2 Windows 桌面应用骨架，完成数据库初始化，实现主窗口和基本导航。

**任务清单**:

| # | 任务 | 前置依赖 | 产出 |
|---|------|----------|------|
| 1.1 | 初始化 Tauri v2 + React + TypeScript 项目 | 无 | 可编译运行的空壳应用 |
| 1.2 | 配置 Tailwind CSS + shadcn/ui，安装基础组件库 | 1.1 | UI 组件环境就绪 |
| 1.3 | 配置 tauri-plugin-sql，创建 SQLite 数据库连接层 | 1.1 | `src/lib/db.ts` 封装 `select/insert/update/delete` |
| 1.4 | 创建数据库表：projects, contacts, tasks, nodes, settings | 1.3 | 应用启动时自动建表（带版本控制 migrations） |
| 1.5 | 实现主窗口：自定义标题栏 + 左侧导航栏（5 项：今日/收件箱/本周/月历/设置） | 1.2 | 状态 B 的基础布局，支持导航切换 |
| 1.6 | 实现悬浮收起态（状态 A）：180x120px 固定尺寸，可垂直拖拽，点击展开 | 1.5 | 独立小窗口或主窗口 resize 动画 |
| 1.7 | 实现系统托盘图标 + 右键菜单（状态 C）：基础版（快速新建/打开/退出） | 1.1 | 托盘常驻，右键菜单可点击 |
| 1.8 | 注册全局快捷键：Ctrl+Shift+T（打开新建浮层，预留） | 1.1 | Rust 后端快捷键监听，IPC 事件传递到前端 |

**数据模型创建清单**:
- `projects` 表（空表）
- `contacts` 表（空表）
- `tasks` 表（空表）
- `nodes` 表（空表）
- `settings` 表（预置默认配置：theme=light, reminder_advance_minutes=15）

**验收标准**:
- [ ] 应用可编译并在 Windows 上运行
- [ ] 主窗口显示，左侧导航可切换（切换时内容区变化）
- [ ] 悬浮收起态显示在屏幕边缘，可点击展开为主窗口
- [ ] 托盘图标常驻，右键菜单可弹出
- [ ] SQLite 数据库文件在 `%APPDATA%/TaskChron/` 下生成
- [ ] 应用重启后数据库数据不丢失

**阶段间衔接**: 阶段二的任务 CRUD 依赖本阶段的数据库表结构和主窗口布局。

---

### 阶段二：任务 CRUD + 今日视图（第 3-4 周）

**目标**: 实现完整的任务增删改查，今日视图可展示任务列表，新建浮层可用。

**任务清单**:

| # | 任务 | 前置依赖 | 产出 |
|---|------|----------|------|
| 2.1 | 实现任务卡片组件（状态 B 中的任务项）：展示标题/时间/对接人/项目/优先级/节点 | 1.5 | 可复用的 `TaskCard` 组件 |
| 2.2 | 实现今日视图：任务列表 + 即将到期面板（按时间排序） | 2.1 | 今日视图可渲染任务数据 |
| 2.3 | 实现新建任务浮层（状态 E）：所有字段输入 + 确认保存 | 1.5 | 浮层可打开，填写后写入数据库 |
| 2.4 | 实现行内编辑（状态 D）：点击任务字段进入编辑，失焦保存 | 2.1 | 任务卡片所有字段可点击编辑 |
| 2.5 | 实现任务完成交互：勾选 -> 动画 -> 0.5s 延迟弹出备注输入 | 2.1 | 勾选后任务状态变为 done，可输入备注 |
| 2.6 | 实现任务删除：移至回收站（软删除）+ Toast 提示 + 撤销按钮 | 2.1 | 删除后 30 天内可恢复 |
| 2.7 | 实现收件箱视图：展示无节点时间的任务 | 2.2 | 左侧导航"收件箱"可切换 |
| 2.8 | 实现项目/联系人管理：新建浮层中支持新建项目和联系人 | 2.3 | 下拉选择器含"+ 新建"选项 |
| 2.9 | 预置 4 个任务模板（会议/评审/周报/联调），新建浮层中可点击填充 | 2.3 | `task_templates` 表预置数据 |

**数据模型创建/修改清单**:
- `task_templates` 表（新增，预置 4 条数据）
- `tasks` 表增加 `deleted_at` 字段（若阶段一未包含则 ALTER TABLE）

**验收标准**:
- [ ] 可通过新建浮层创建任务，任务显示在今日视图
- [ ] 可点击任务卡片字段进行行内编辑，修改即时保存
- [ ] 可勾选完成任务，弹出备注输入框
- [ ] 可删除任务，任务消失并显示"已移至回收站 [撤销]"
- [ ] 收件箱视图显示无节点时间的任务
- [ ] 托盘右键"快速新建"可打开新建浮层

**阶段间衔接**: 阶段三的提醒系统依赖本阶段的 tasks/nodes 表和任务状态管理。

---

### 阶段三：节点提醒 + 周视图/月历视图（第 5-6 周）

**目标**: 实现节点提醒系统，周视图和月历视图可用。

**任务清单**:

| # | 任务 | 前置依赖 | 产出 |
|---|------|----------|------|
| 3.1 | Rust 后端实现定时轮询器（每分钟一次），查询即将到期节点 | 1.3 | `src-tauri/src/reminder.rs` |
| 3.2 | 集成 Tauri notification 插件，发送 Windows Toast 提醒 | 3.1 | 节点到期前弹出系统通知 |
| 3.3 | 实现节点自动过期标记：node_time < now 且 pending 的任务自动变红 | 2.1 | 任务卡片过期态视觉呈现 |
| 3.4 | 实现周视图（状态 F）：7 列网格，任务卡片按日期分布 | 1.5 | 左侧导航"本周"可切换 |
| 3.5 | 实现周视图拖拽跨日：拖拽任务到另一日期列，确认后更新节点时间 | 3.4 | 拖拽交互可用 |
| 3.6 | 实现月历视图（状态 G）：日历网格 + 状态点 + 月度概览统计 | 1.5 | 左侧导航"月历"可切换 |
| 3.7 | 月历视图集成 ECharts 趋势图（底部迷你折线图） | 3.6 | 展示本月每日完成数趋势 |
| 3.8 | 实现三视图联动：月历/周视图点击日期 -> 切换到该日今日视图 | 3.4, 3.6 | 视图间导航畅通 |

**数据模型创建/修改清单**:
- `nodes` 表增加 `reminded` 字段（若阶段一未包含则 ALTER TABLE）
- `settings` 表增加 `reminder_advance_minutes` 配置

**验收标准**:
- [ ] 创建带节点时间的任务，在节点前 15 分钟收到 Windows Toast 通知
- [ ] 节点过期后任务卡片自动显示红色高亮
- [ ] 周视图显示整周任务分布，可拖拽任务跨日调整
- [ ] 月历视图显示整月日历，有任务的日期显示状态点
- [ ] 月历视图底部趋势图正常渲染

**阶段间衔接**: 阶段四的日志系统依赖本阶段的任务状态变化和操作记录。

---

### 阶段四：日志视图 + 设置面板 + 数据管理（第 7-8 周）

**目标**: 实现操作日志、设置面板、数据备份恢复。

**任务清单**:

| # | 任务 | 前置依赖 | 产出 |
|---|------|----------|------|
| 4.1 | 创建 `activity_logs` 表，封装日志写入层 | 1.3 | 所有增删改操作自动记录日志 |
| 4.2 | 实现日志视图（左侧导航"日志"）：时间轴展示操作记录 | 4.1 | 可查看谁（什么操作）在什么时间改了什么 |
| 4.3 | 实现设置面板（状态 L）：通用/外观/通知/推送/导出/数据/快捷键/关于 8 个 Tab | 1.5 | 所有配置项可修改并持久化 |
| 4.4 | 实现深色模式：Tailwind dark: 前缀 + 系统主题监听 | 4.3 | 设置中切换主题即时生效 |
| 4.5 | 实现数据备份：一键导出 `.taskchron` 文件到指定目录 | 1.3 | 备份按钮可用 |
| 4.6 | 实现数据恢复：从 `.taskchron` 文件恢复数据库 | 4.5 | 恢复后数据正确加载 |
| 4.7 | 实现回收站管理：设置面板中查看回收站、恢复单条/清空回收站 | 2.6 | 回收站功能完整 |
| 4.8 | 实现快捷键自定义：设置面板中修改快捷键，保存到 settings | 4.3 | 快捷键可自定义 |

**数据模型创建清单**:
- `activity_logs` 表（新增）
- `settings` 表补充所有配置键的默认值

**验收标准**:
- [ ] 创建/编辑/删除任务后，日志视图显示对应操作记录
- [ ] 设置面板所有 Tab 可正常切换和修改
- [ ] 切换深色模式后整个界面主题变化
- [ ] 可成功备份数据库并在恢复后数据完整
- [ ] 回收站中的任务可恢复，清空后永久删除

**阶段间衔接**: 阶段五的语音输入和 NLP 依赖本阶段的基础数据操作能力。

---

### 阶段五：语音输入 + NLP + 高级搜索（第 9-10 周）

**目标**: 实现语音输入、NLP 解析、高级搜索面板。

**任务清单**:

| # | 任务 | 前置依赖 | 产出 |
|---|------|----------|------|
| 5.1 | 封装 Web Speech API：录音、实时转写、结束检测 | 1.1 | `src/lib/voice.ts` |
| 5.2 | 实现语音输入浮层（状态 E-Voice）：录音中 UI + 波形动画 + 解析预览 | 5.1 | 浮层可录音并显示转写结果 |
| 5.3 | 实现 NLP 规则引擎：解析中文日期时间（明天下午3点）、对接人、优先级 | 5.2 | "明天下午3点和李四过方案" 正确解析 |
| 5.4 | 新建浮层集成 NLP：输入后 800ms 自动触发解析，自动填充字段 | 5.3 | 状态 E 的 NLP 自动填充可用 |
| 5.5 | 创建 `voice_records` 表，保存原始转写和解析结果 | 1.3 | 语音历史可回溯 |
| 5.6 | 实现高级搜索面板（状态 K）：多条件组合过滤 + 结果列表 | 2.1 | 搜索浮层可用 |
| 5.7 | 实现批量操作模式（状态 J）：多选 + 批量完成/改优先级/移动项目/删除 | 2.1 | 批量操作可用 |
| 5.8 | 实现对接人档案浮层（状态 M）：点击对接人名称弹出档案 | 2.8 | 档案浮层展示统计和最近任务 |

**数据模型创建清单**:
- `voice_records` 表（新增）

**验收标准**:
- [ ] 点击麦克风或按 Ctrl+Shift+R 可录音，语音内容被正确转写
- [ ] NLP 自动解析"明天下午3点和李四过方案"，自动填充对应字段
- [ ] 高级搜索可按日期/项目/对接人/优先级/状态组合过滤
- [ ] 批量操作可选择多个任务并批量修改
- [ ] 点击对接人名称弹出档案浮层，显示合作统计

**阶段间衔接**: 阶段六的日报/周报生成依赖本阶段的任务数据完整性和搜索能力。

---

### 阶段六：日报/周报生成 + 推送 + 导出（第 11-13 周）

**目标**: 实现日报/周报自动生成、预览编辑、微信/企微推送、Excel/Word 导出。

**任务清单**:

| # | 任务 | 前置依赖 | 产出 |
|---|------|----------|------|
| 6.1 | 实现日报 Markdown 生成引擎：按项目/对接人分组，合并任务+备注 | 2.1 | `src/lib/report-gen.ts` |
| 6.2 | 实现日报预览浮层（状态 H）：双栏 Markdown 编辑器 + 实时预览 | 6.1 | 浮层可预览和编辑日报 |
| 6.3 | 实现周报 Markdown 生成引擎：按日期分组，自动提取亮点+下周计划 | 6.1 | 周报内容自动生成 |
| 6.4 | 实现周报预览浮层（状态 I）：同日报双栏结构 | 6.3 | 浮层可预览和编辑周报 |
| 6.5 | 实现企业微信 Webhook 推送：HTTP POST Markdown 消息 | 6.2, 6.4 | 点击"发送"后消息推送到企业微信群 |
| 6.6 | 实现 Excel 导出：多 sheet（按日期/项目/对接人）+ 统计汇总 | 2.1 | xlsx.js 前端生成 |
| 6.7 | 实现 Word 导出：日报/周报文档结构（标题/表格/段落） | 6.2, 6.4 | docx.js 前端生成 |
| 6.8 | 实现自动触发：日报每日 17:25 弹窗、周报每周五 17:00 弹窗 | 3.1 | Rust 定时器触发前端弹窗 |
| 6.9 | 创建 `daily_reports` 和 `weekly_reports` 表，记录发送状态 | 1.3 | 发送历史可追溯 |
| 6.10 | 托盘菜单集成："立即发送日报/周报" | 6.5 | 托盘可直接触发发送 |

**数据模型创建清单**:
- `daily_reports` 表（新增）
- `weekly_reports` 表（新增）

**验收标准**:
- [ ] 日报自动/手动生成 Markdown，内容正确分组
- [ ] 日报双栏编辑器可修改内容，右侧实时预览
- [ ] 配置 Webhook 后可成功推送到企业微信
- [ ] Excel 导出含多 sheet 和统计汇总
- [ ] Word 导出文档结构正确，可直接打印
- [ ] 每日 17:25 自动弹出日报预览（若开启自动发送）

**阶段间衔接**: 阶段七的收尾打磨依赖本阶段所有核心功能已完成。

---

### 阶段七：动画打磨 + 性能优化 + 发布准备（第 14-15 周）

**目标**: 提升视觉品质，优化性能，准备发布。

**任务清单**:

| # | 任务 | 前置依赖 | 产出 |
|---|------|----------|------|
| 7.1 | 实现所有动画：悬浮展开/收起（250ms 弹簧曲线）、任务完成划线（400ms）、新建插入（300ms） | 全阶段 | 动画流畅自然 |
| 7.2 | 性能优化：大数据量任务列表虚拟滚动（若任务>200 条）、SQLite 查询索引优化 | 全阶段 | 列表滚动不卡顿 |
| 7.3 | 托盘图标状态感知：根据任务状态动态切换图标颜色 | 3.3 | 托盘图标实时反映状态 |
| 7.4 | 全局快捷键参考浮层：按 `?` 或点击"帮助"显示快捷键速查表 | 4.8 | 快捷键文档内置 |
| 7.5 | 错误边界和崩溃恢复：前端 ErrorBoundary，Rust panic 处理 | 全阶段 | 应用不白屏 |
| 7.6 | 安装包构建：Tauri 打包为 `.msi` 安装程序 | 全阶段 | 可分发安装包 |
| 7.7 | 编写 README 和 AGENTS.md 文档 | 全阶段 | 项目文档完整 |
| 7.8 | 端到端测试：覆盖主要用户流程（新建->完成->日报->导出） | 全阶段 | 核心流程稳定 |

**验收标准**:
- [ ] 所有界面切换和交互都有流畅动画
- [ ] 任务列表在 500 条数据下滚动流畅
- [ ] 托盘图标根据状态正确变色
- [ ] 安装包可在 Windows 10/11 上正常安装运行
- [ ] 核心用户流程测试全部通过

---

### 开发计划总览图

```
Week:  1-2   3-4   5-6   7-8   9-10  11-13  14-15
       +-----+-----+-----+-----+-------+-------+
阶段一 |=====|     |     |     |       |       | 基础骨架
阶段二 |     |=====|     |     |       |       | 任务CRUD+今日视图
阶段三 |     |     |=====|     |       |       | 提醒+周/月视图
阶段四 |     |     |     |=====|       |       | 日志+设置+数据管理
阶段五 |     |     |     |     |=======|       | 语音+NLP+搜索+批量
阶段六 |     |     |     |     |       |=======| 日报/周报+推送+导出
阶段七 |     |     |     |     |       |       |=======| 打磨+发布
       +-----+-----+-----+-----+-------+-------+
```

### 各阶段数据模型演进图

```
阶段一: projects, contacts, tasks, nodes, settings
阶段二: + task_templates (新增)
阶段三: nodes 增加 reminded 字段
阶段四: + activity_logs (新增)
阶段五: + voice_records (新增)
阶段六: + daily_reports, weekly_reports (新增)
阶段七: 无表变更（仅优化和索引调整）
```

### 关键接口清单（供开发 Agent 参考）

**前端 -> SQLite 封装层（`src/lib/db.ts`）**:
```typescript
// 任务 CRUD
async function createTask(task: TaskInsert): Promise<Task>
async function updateTask(id: string, patch: TaskPatch): Promise<void>
async function deleteTask(id: string): Promise<void> // 软删除
async function restoreTask(id: string): Promise<void>
async function getTasksByDate(date: Date): Promise<TaskWithRelations[]>
async function getTasksByWeek(weekStart: Date): Promise<TaskWithRelations[]>
async function getInboxTasks(): Promise<TaskWithRelations[]>
async function searchTasks(filter: SearchFilter): Promise<TaskWithRelations[]>

// 节点
async function createNode(node: NodeInsert): Promise<Node>
async function updateNode(id: string, patch: NodePatch): Promise<void>
async function getUpcomingNodes(minutes: number): Promise<NodeWithTask[]>

// 日报/周报
async function generateDailyReport(date: Date): Promise<DailyReportData>
async function generateWeeklyReport(weekStart: Date): Promise<WeeklyReportData>
async function saveDailyReportMeta(report: DailyReportMeta): Promise<void>
async function saveWeeklyReportMeta(report: WeeklyReportMeta): Promise<void>

// 设置
async function getSetting(key: string): Promise<string | null>
async function setSetting(key: string, value: string): Promise<void>

// 日志
async function logActivity(log: ActivityLogInsert): Promise<void>
async function getActivityLogs(entityType?: string, entityId?: string): Promise<ActivityLog[]>

// 备份
async function backupDatabase(targetPath: string): Promise<void>
async function restoreDatabase(sourcePath: string): Promise<void>
```

**前端 -> Rust IPC 接口**:
```typescript
// 托盘/窗口
invoke('set_tray_icon', { state: 'normal' | 'warning' | 'danger' | 'done' })
invoke('show_window')
invoke('hide_window')
invoke('set_window_position', { x: number, y: number })

// 通知
invoke('send_notification', { title: string, body: string })

// 全局快捷键（注册在 Rust 端，触发后发送事件到前端）
// 前端监听: listen('shortcut-quick-add', () => openQuickCapture())
//           listen('shortcut-voice', () => openVoiceInput())

// 文件系统
invoke('save_file_dialog', { defaultName: string }): Promise<string | null>
invoke('open_backup_folder')
```

---

*文档结束。本方案作为时记 TaskChron v2.0 终局设计基准，所有开发工作严格按此文档执行。*

