工作日志记录系统
概述
通过微信消息记录工作日志,支持智能识别输入内容,自动分类存储,支持查询和报告生成。
存储位置
- Linux:
~/worklog/ - Windows:
C:\Users\<当前用户>\Documents\worklog\
首次触发时自动检测并初始化目录和数据库,无需手动操作。
worklog/
├── worklog.db ← SQLite 索引库
├── daily/ ← 每日日志
├── weekly/ ← 周报
├── monthly/ ← 月报
└── templates/ ← 报告模板(用户自定义)
数据库结构
CREATE TABLE IF NOT EXISTS tasks (
id TEXT PRIMARY KEY, -- 格式: YYYYMMDD-NNN
title TEXT NOT NULL, -- 简要标题
status TEXT DEFAULT 'todo', -- todo / in_progress / done / blocked
category TEXT, -- 分类编码,见 references/categories.md
blocked_reason TEXT, -- 阻塞原因(status=blocked 时填写)
created_at DATETIME, -- 初次记录时间
updated_at DATETIME, -- 最新更新时间
completed_at DATETIME -- 完成时间(未完成为NULL)
);
工作分类
分类定义在 references/categories.md,用户可增删改。
默认分类:COORD(对接协调)、TECH(技术支持)、ACCESS(权限申请)、DOC(材料撰写)、PROC(流程/规范)、MEET(会议)、TRAIN(培训)、APPROVE(审批)、DATA(数据/报表)、OTHER(其他)
AI 根据用户消息自动推断分类,不确定时使用 OTHER。
首次使用时提示用户:
> 工作分类已预设10种常见类型(对接协调、技术支持、权限申请等)。你可以随时让我增删改分类,比如"加上一个【项目管理】分类"或"把【培训】删掉"。
用户输入识别
| 意图 | 典型表达 | 处理 |
|---|---|---|
| 新增待办 | "有个任务"、"帮xxx做"、"xxx要做"、"未来要xxx" | → 新增流程 |
| 完成工作 | "xxx搞定了"、"xxx完成了" | → 完成流程 |
| 进展更新 | "xxx已经xxx"、"xxx在推进" | → 更新流程 |
| 删除/作废 | "xxx不用做了"、"xxx取消了" | → 删除流程 |
| 查询日志 | "我今天做了什么"、"和xxx的工作" | → 查询流程 |
| 生成报告 | "生成周报"、"月报" | → 报告流程 |
语音输入处理: 用户可能通过微信语音转文字输入,文字可能有错别字或口语化表达。识别意图时要宽容匹配,不理解时主动询问。
日志记录流程
新增待办
- 从消息中提取:标题、分类(推断,参考 categories.md)
- 生成 id(从数据库查当日最大序号 +1,当日无记录则为 001)
- 写入
worklog.db,状态默认 todo - 追加到当日
daily/YYYY-MM-DD.md - 查询当前所有未完成条目,附在回复中
- 回复确认 + 未完成清单
回复格式:
✅ 已记录:{标题}({id})
📋 当前待办(X项):
🔴 {id} | {标题} | {分类中文名}
🟡 {id} | {标题} | {分类中文名}
注意:
1. 分类使用中文名称(如"对接协调"、"技术支持"),不要使用编码(如COORD、TECH)。
2. 待办列表每条之间用双换行(\n\n)分隔,确保微信 PC 客户端正确换行。
3. "已记录"与"当前待办"标题之间也是双换行。
4. "当前待办"标题与第一条待办之间也是双换行。
完成工作
- 从消息中匹配已有条目
- 优先匹配当日未完成条目
- 模糊匹配标题关键词
- 匹配不到时,列出当前所有未完成条目供用户选择 - 更新数据库:status → done,设置 completed_at
- 在当日
daily/.md 中追加完成记录 - 查询剩余未完成条目,附在回复中
- 回复确认 + 未完成清单
回复格式:
🎉 已完成:{标题}({id})
📋 当前待办(X项):
...
进展更新
- 匹配已有条目(同完成流程的匹配逻辑)
- 更新数据库 updated_at
- 在当日
daily/.md 中追加进展行 - 查询未完成条目,附在回复中
- 回复确认 + 未完成清单
回复格式:
📝 已更新:{标题}({id})
📋 当前待办(X项):
...
删除/作废
- 匹配已有条目
- 从数据库删除该条目
- 在当日
daily/.md 中追加作废记录 - 回复确认
回复格式:
❌ 已取消:{标题}({id})
阻塞标记
当用户提到"等xxx"、"被卡住了"、"需要xxx才能继续"时:
1. 匹配对应条目
2. 更新数据库:status → blocked,记录 blocked_reason
3. 在当日 .md 中追加阻塞记录
4. 回复确认
回复格式:
⚠️ 已标记阻塞:{标题}({id})
原因:{blocked_reason}
批量完成
当用户一口气完成多项工作("A、B、C都搞定了"):
1. 逐项匹配并完成
2. 每项独立记录到 .md
3. 汇总回复一次
回复格式:
🎉 批量完成(X项):
✅ {标题1}({id1})
✅ {标题2}({id2})
📋 剩余待办(X项):
...
每日 .md 文件说明
重要:每日文件记录的是"当天有活动的工作",而非"当天创建的工作"。
- 新增的待办写入当天日期的 .md 文件
- 完成或更新已有工作时,写入该工作活动当天的 .md 文件
- 一项工作跨越多天时,每天的文件里都会有它的记录
文件路径:daily/YYYY-MM-DD.md
详细格式规范见 references/log-format.md。
查询流程
- 根据用户查询条件构建 SQL
- 从
worklog.db检索匹配条目 - 读取对应
daily/.md 文件获取详情 - 整理后回复
常用查询:
- 按时间范围:今日/本周/本月/自定义
- 按状态:待办/进行中/已完成/已阻塞
- 按分类:筛选特定类型工作
- 按关键词:标题模糊匹配
- 全文搜索:扫描 .md 文件内容
查询"今日待办"时:
- 从数据库查询所有 status != done 的条目(全局未完成清单)
- 从 daily/今日日期.md 读取今日有活动的工作详情
- 两者结合展示
查询结果回复格式:
🔍 查询结果(X项):
🟢 20260605-001 | 准备周会汇报材料 | 材料撰写 | 已完成
🟡 20260605-002 | 对接XX项目需求 | 对接协调 | 进行中
🔴 20260605-003 | 学习新流程 | 流程/规范 | 待处理
注意:每条记录独占一行。分类使用中文名称,不要使用编码。
报告生成
模板文件
- 周报邮件模板:
templates/weekly_report.html - 月报邮件模板:
templates/monthly_report.html - 消息模板:见
references/log-format.md
周报生成
- 查询本周所有条目
- 填充
templates/weekly_report.html模板变量 - 发送邮件(QQ邮箱,HTML正文)
- 通过消息发送纯文本摘要(格式见
references/log-format.md周报模板)
月报生成
- 查询本月所有条目
- 填充
templates/monthly_report.html模板变量 - 发送邮件(QQ邮箱,HTML正文)
- 通过消息发送纯文本摘要(格式见
references/log-format.md月报模板)
日报生成
用户要求"今日总结"或"日报"时:
1. 查询今日所有条目(新增 + 有活动的)
2. 通过消息发送纯文本摘要(格式见 references/log-format.md 日报模板)
3. 不发邮件
定时任务
日报、周报、月报均支持定时自动执行。首次生成报告时,提醒用户创建对应的定时任务。
定时任务提醒
首次生成日报时提醒:
> 是否要设置定时任务,每天自动发送日报?建议设置在下午5-6点。
首次生成周报时提醒:
> 是否要设置定时任务,每周自动发送周报?建议设置在周五下午。
首次生成月报时提醒:
> 是否要设置定时任务,每月自动发送月报?建议设置在月末最后一个工作日。
定时任务执行规范
创建定时任务时,需使用 openclaw cron add 命令。以下是完整的创建命令和说明。
日报定时任务(建议每天下午5-6点执行):
openclaw cron add \
--name "worklog-daily-report" \
--description "工作日报自动生成" \
--cron "0 17 * * *" \
--tz "Asia/Shanghai" \
--session "isolated" \
--timeout-seconds 300 \
--channel openclaw-weixin \
--to "用户微信ID" \
--message "请执行工作日报任务:
1. 检查 ~/worklog/worklog.db 数据库是否存在,不存在则先运行初始化脚本
2. 连接数据库,查询今日所有条目(status 为 todo/in_progress/done/blocked 的记录)
3. 同时读取 ~/worklog/daily/今日日期.md 文件,获取今日活动详情
4. 按照以下格式整理并发送给用户:
📋 YYYY-MM-DD 工作日报
✅ 已完成 X 项:
1. [ID] 标题 | 分类中文名
🟡 进行中 X 项:
1. [ID] 标题 | 分类中文名(当前状态)
🔴 待处理 X 项:
1. [ID] 标题 | 分类中文名
⚫ 已阻塞 X 项:
1. [ID] 标题 | 分类中文名(阻塞原因)
注意:每项独占一行,分类使用中文名称。"
周报定时任务(建议每周五下午执行):
openclaw cron add \
--name "worklog-weekly-report" \
--description "工作周报自动生成" \
--cron "0 16 * * 5" \
--tz "Asia/Shanghai" \
--session "isolated" \
--timeout-seconds 600 \
--channel openclaw-weixin \
--to "用户微信ID" \
--message "请执行工作周报任务:
1. 检查 ~/worklog/worklog.db 数据库是否存在
2. 连接数据库,查询本周所有条目(根据 created_at 或 updated_at 在本周范围内)
3. 读取本周的 daily/*.md 文件获取详细信息
4. 填充 ~/worklog/../skills/work-logger/templates/weekly_report.html 模板:
- 替换 {{PERIOD}} 为周数(如第23周)
- 替换 {{DATE_RANGE}} 为日期范围(如 2026.06.02 - 2026.06.06)
- 替换 {{NAME}} 为用户姓名(从 USER.md 获取)
- 替换 {{TOTAL}} {{DONE}} {{IN_PROGRESS}} {{TODO}} {{BLOCKED}} 为统计数据
- 替换 {{TASKS_DONE}} {{TASKS_IN_PROGRESS}} {{TASKS_TODO}} {{TASKS_BLOCKED}} 为各分类任务的HTML列表
- 替换 {{NEXT_PLAN}} 为下周计划(从进行中和待处理的任务推断)
- 替换 {{GENERATED_AT}} 为当前时间
5. 使用用户配置的邮箱发送邮件(查看 TOOLS.md 获取 SMTP 配置),HTML作为邮件正文
6. 按以下格式发送消息摘要给用户:
📋 本周工作周报(MM.DD - MM.DD)
✅ 已完成 X 项:
1. 标题
🟡 进行中 X 项:
1. 标题(当前状态)
🔴 待处理 X 项:
1. 标题
⚫ 已阻塞 X 项:
1. 标题(原因)
📅 下周计划:
1. ...
注意:每项独占一行。"
月报定时任务(建议月末最后一个工作日执行):
openclaw cron add \
--name "worklog-monthly-report" \
--description "工作月报自动生成" \
--cron "0 16 28-31 * *" \
--tz "Asia/Shanghai" \
--session "isolated" \
--timeout-seconds 600 \
--channel openclaw-weixin \
--to "用户微信ID" \
--message "请执行工作月报任务:
1. 检查 ~/worklog/worklog.db 数据库是否存在
2. 连接数据库,查询本月所有条目
3. 读取本月的 daily/*.md 文件获取详细信息
4. 填充 ~/worklog/../skills/work-logger/templates/monthly_report.html 模板:
- 替换 {{PERIOD}} 为月份(如2026年6月)
- 替换 {{DATE_RANGE}} 为日期范围(如 2026.06.01 - 2026.06.30)
- 替换 {{NAME}} 为用户姓名
- 替换统计数据变量:{{TOTAL}} {{DONE}} {{IN_PROGRESS}} {{TODO}} {{BLOCKED}}
- 替换 {{COMPLETION_RATE}} 为完成百分比(DONE/TOTAL*100取整)
- 替换 {{REMAINING_RATE}} 为 100-COMPLETION_RATE
- 替换 {{W1_DONE}} {{W2_DONE}} {{W3_DONE}} {{W4_DONE}} 为各周完成数
- 替换 {{CATEGORY_STATS}} 为分类统计的HTML表格行
- 替换 {{TASKS_DONE}} {{TASKS_IN_PROGRESS}} {{TASKS_TODO}} {{TASKS_BLOCKED}} 为详细列表
- 替换 {{MONTHLY_SUMMARY}} 为月度总结(AI根据任务内容生成)
- 替换 {{GENERATED_AT}} 为当前时间
5. 使用用户配置的邮箱发送邮件(查看 TOOLS.md 获取 SMTP 配置),HTML作为邮件正文
6. 按以下格式发送消息摘要给用户:
📊 X月工作月报
总任务:X | 完成:X | 进行中:X | 待处理:X | 阻塞:X
完成率:XX%
✅ 重点工作完成:
1. 标题
🟡 未完成事项:
1. 标题(原因)
📅 下月计划:
1. ...
注意:每项独占一行。"
注意:
- --to 参数需替换为用户的实际微信ID(格式如 xxx@im.wechat)
- 月报的 cron 表达式 0 16 28-31 * * 会在每月28-31日的16点都触发,任务内部需判断是否为当月最后一天
- 超时时间:日报建议300秒,周报/月报建议600秒
- 首次创建定时任务后,建议用 openclaw cron run <job-id> 手动测试一次
邮件发送
邮件发送配置根据用户的 TOOLS.md 或其他配置文件获取。创建定时任务或执行报告任务时,应读取用户的 TOOLS.md 获取 SMTP 服务器、端口、发件人、授权码等信息,不要硬编码邮箱地址。
初始化脚本
scripts/init_db.py — 首次使用时自动调用,无需手动执行。
python3 scripts/init_db.py <worklog目录路径>