smart-task-scheduler
# 智能任务与排班管理系统
一个先进的个人任务与排班管理系统,能根据您复杂的多时段工作安排动态调整提醒,支持从表格文件导入排班,并通过自然语言修改排班。
## 核心优势
- **多时段工作支持**:完整支持"早"、"晚"、"早晚"等多种工作时段安排
- **排班自适应提醒**:根据您每天实际的多个工作时段动态计算提醒时间
- **灵活提醒规则**:支持基于特定工作时段开始前/后的提醒
- **表格导入**:支持上传Excel/CSV排班表,自动解析并存储
- **自然语言修改**:可通过对话直接修改排班信息
- **智能时段选择**:为任务自动选择最合适的工作时段
## 功能特性
### 1. 多时段排班管理
- **多时段工作安排**:支持单个时段、多个时段的复杂工作安排
- **排班表格导入**:支持上传Excel/CSV文件,自动解析复杂排班信息
- **自然语言修改**:通过对话直接修改特定日期的上班时间和时段安排
- **时段智能选择**:为任务自动选择最合适的工作时段
- **排班查询**:查询任意日期的排班信息和时段安排
### 2. 智能任务管理
- **动态提醒计算**:根据当天实际工作时段计算提醒时间
- **多时段提醒规则**:
- `before_shift_start:X`:指定时段开始前X分钟提醒
- `after_shift_start:X`:指定时段开始后X分钟提醒
- `between_shifts:X`:两个工作时段之间提前X分钟提醒
- `fixed_time:HH:MM`:固定时间提醒
- **时段自动匹配**:根据任务描述自动推荐最合适的工作时段
### 3. 智能提醒系统
- **智能体对话提醒**:在适当时间主动发起对话提醒,支持交互操作
- **时段关联提醒**:为同一任务在不同时段设置不同提醒
## 工具接口
### `import_schedule`
**导入排班表**
从Excel或CSV文件导入排班信息。文件格式需包含日期、工作时段等列。
*参数*:
- `file_path`: (字符串) 排班表文件路径
- `format`: (字符串) 文件格式,`excel` 或 `csv`
*示例*:
`/import_schedule /path/to/schedule.xlsx excel`
### `update_schedule`
**更新排班信息**
通过自然语言修改特定日期的排班信息。
*参数*:
- `date`: (字符串) 要修改的日期,格式为 `YYYY-MM-DD` 或自然语言如"明天"、"下周一"
- `change_description`: (字符串) 变更描述,如"明天上早晚班"、"周三晚班"
*示例*:
`/update_schedule 明天 早晚班,9:30-11:30 和 16:00-21:30`
### `show_schedule`
**查看排班**
查看指定日期范围的排班信息。
*参数*:
- `start_date`: (字符串,可选) 开始日期,默认为今天
- `end_date`: (字符串,可选) 结束日期,默认为7天后
- `format`: (字符串,可选) 输出格式,`table`(表格) 或 `list`(列表)
*示例*:
`/show_schedule 2026-04-01 2026-04-07 table`
### `add_smart_task`
**添加智能任务**
添加能根据排班动态调整提醒时间的任务。系统会根据任务类型和时段自动选择最合适的提醒时段。
*参数*:
- `description`: (字符串) 任务描述
- `due_date`: (字符串) 截止日期,格式为 `YYYY-MM-DD` 或自然语言
- `reminder_rule`: (字符串) 提醒规则,支持:
- `before_first_shift:30` (第一时段开始前30分钟)
- `after_first_shift_start:15` (第一时段开始后15分钟)
- `before_second_shift:30` (第二时段开始前30分钟)
- `between_shifts:60` (两时段之间提前60分钟)
- `fixed_time:14:00` (固定时间)
- `task_type`: (字符串,可选) 任务类型,帮助系统选择时段,如`morning_task`, `between_shift_task`, `evening_task`
- `priority`: (字符串,可选) 优先级,`high`/`medium`/`low`
*示例*:
`/add_smart_task 买早餐 明天 before_first_shift:20 high morning_task`
### `calculate_reminders`
**计算提醒时间**
为所有任务计算基于排班的实际提醒时间。
*参数*:
- `date`: (字符串,可选) 计算指定日期的提醒,默认为明天
*示例*:
`/calculate_reminders 2026-04-01`
## 配置要求
### 环境变量
飞书应用配置 (必需)
FEISHU_APP_ID=your_app_id
FEISHU_APP_SECRET=your_app_secret
文件路径配置 (可选)
SCHEDULE_FILE_PATH=/path/to/schedule.json
TASKS_FILE_PATH=/path/to/tasks.json
### 定时任务配置
创建以下定时任务以实现自动化:
1. **每日排班同步**(每晚22:00运行,同步明天的排班和任务):
openclaw cron add \
--name "每日排班同步" \
--cron "0 22 * * *" \
--tz "Asia/Shanghai" \
--session isolated \
--message "请执行以下操作:1. 调用'smart-task-scheduler'技能的'calculate_reminders'功能,为明天的任务计算基于排班的提醒时间。2. 返回执行摘要,格式:[排班同步] 已为X个任务计算提醒时间。明天的工作时段是:Z。" \
--announce \
--agent smart-task-scheduler
2. **时段智能提醒**(根据实际工作时段的开始时间动态触发):
openclaw cron add \
--name "工作时段提醒" \
--cron "0 7,9,13,15,20 * * 1-5" \
--tz "Asia/Shanghai" \
--session main \
--system-event "请检查当前时间是否需要触发提醒。调用'smart-task-scheduler'技能的'check_shift_reminders'功能,如果当前时间接近任何任务的提醒时间,在对话中提醒我。" \
--wake hourly \
--agent smart-task-scheduler
## 数据结构
### 1. 多时段排班表 (`workspace/work_schedule.json`)
json
{
"schedule": [
{
"date": "2026-04-01",
"work_shifts": [
{
"shift_type": "晚班",
"start": "15:30",
"end": "22:30",
"shift_index": 0
}
],
"notes": "周三晚班",
"tags": ["晚班"]
},
{
"date": "2026-04-02",
"work_shifts": [
{
"shift_type": "早班",
"start": "09:30",
"end": "11:30",
"shift_index": 0
},
{
"shift_type": "晚班",
"start": "16:00",
"end": "21:30",
"shift_index": 1
}
],
"notes": "周四早晚班",
"tags": ["早晚班", "多时段"]
},
{
"date": "2026-04-03",
"work_shifts": [
{
"shift_type": "早班",
"start": "08:00",
"end": "15:30",
"shift_index": 0
}
],
"notes": "周五早班",
"tags": ["早班"]
}
],
"default_schedule": {
"work_shifts": [
{
"shift_type": "标准班",
"start": "09:30",
"end": "18:30",
"shift_index": 0
}
]
},
"shift_types": {
"早班": {"typical_start": "08:00", "typical_end": "16:00"},
"晚班": {"typical_start": "15:00", "typical_end": "23:00"},
"早晚班": {"description": "分早晚两个时段"}
},
"last_updated": "2026-03-31T14:20:00Z"
}
### 2. 智能任务文件 (`workspace/smart_tasks.json`)
json
{
"smart_tasks": [
{
"id": "st_20260401_001",
"description": "上班前买晚餐食材",
"due_date": "2026-04-01",
"reminder_rule": "before_shift_start:60",
"target_shift": 0,
"target_shift_type": "晚班",
"calculated_time": "2026-04-01 14:30",
"priority": "high",
"completed": false,
"notes": "超市17点关门,记得下班前去"
},
{
"id": "st_20260402_001",
"description": "两班之间去银行",
"due_date": "2026-04-02",
"reminder_rule": "between_shifts:30",
"calculated_time": "2026-04-02 11:30", // 第一时段结束后,第二时段开始前
"priority": "medium",
"completed": false,
"recurring_source": "weekly_bank"
},
{
"id": "st_20260402_002",
"description": "早班后去健身房",
"due_date": "2026-04-02",
"reminder_rule": "after_shift_end:15",
"target_shift": 0,
"calculated_time": "2026-04-02 11:45",
"priority": "medium"
}
],
"recurring_rules": [
{
"id": "weekly_bank",
"description": "每周银行办事",
"cycle": "weekly",
"cycle_config": {"day_of_week": 4}, // 周四
"reminder_rule": "between_shifts:30",
"shift_preference": "between_shifts",
"active": true
}
],
"settings": {
"feishu_reminder_minutes": 10,
"default_shift_type": "标准班",
"timezone": "Asia/Shanghai"
}
}
### 3. Excel/CSV排班表格式
支持多种格式,最推荐格式如下:
**推荐格式**:
| 日期 | 班次类型 | 时段1开始 | 时段1结束 | 时段2开始 | 时段2结束 | 备注 |
|------------|----------|------------|------------|------------|------------|------------|
| 2026-04-01 | 晚班 | 15:30 | 22:30 | | | 周三晚班 |
| 2026-04-02 | 早晚班 | 09:30 | 11:30 | 16:00 | 21:30 | 周四早晚班 |
| 2026-04-03 | 早班 | 08:00 | 15:30 | | | 周五早班 |
**简化格式**(单时段自动解析):
| 日期 | 排班描述 | 备注 |
|------------|------------------------|------------|
| 2026-04-01 | 晚(15:30-22:30) | 周三晚班 |
| 2026-04-02 | 早晚(9:30-11:30 16:00-21:30) | 周四早晚班 |
| 2026-04-03 | 早(8:00-15:30) | 周五早班 |
**自动解析规则**:
- "早(8:00-15:30)" → 解析为早班,时段:08:00-15:30
- "晚(15:30-22:30)" → 解析为晚班,时段:15:30-22:30
- "早晚(9:30-11:30 16:00-21:30)" → 解析为两个时段:09:30-11:30 和 16:00-21:30
## 使用示例
### 场景一:上传多时段排班表
1. **准备排班表**(Excel格式,使用推荐格式)
2. **上传排班表**:
用户:帮我上传这个月的排班表
(用户发送排班表文件)
技能:/import_schedule /path/to/uploaded/schedule.xlsx excel
(解析并存储排班信息,自动识别多时段)
### 场景二:设置基于不同时段的提醒
1. **晚班前的任务**:
用户:明晚上晚班,下午3点提醒我去超市
技能:检测到明天是晚班(15:30-22:30)。/add_smart_task 去超市采购 明天 before_shift_start:30
(自动计算:15:30前30分钟 = 15:00提醒)
2. **早晚班之间的任务**:
用户:周四早晚班之间提醒我去银行
技能:检测到周四是早晚班(09:30-11:30 和 16:00-21:30)。/add_smart_task 去银行办事 2026-04-02 between_shifts:30
(自动计算:第一时段结束后,第二时段开始前30分钟 = 11:30提醒)
3. **早班后的任务**:
用户:周五早班后提醒我去健身房
技能:检测到周五是早班(08:00-15:30)。/add_smart_task 健身房锻炼 2026-04-03 after_shift_end:15
(自动计算:15:30后15分钟 = 15:45提醒)
### 场景三:自然语言修改多时段排班
用户:下周三改成早晚班
技能:/update_schedule 2026-04-08 早晚班,时段1:9:30-11:30,时段2:16:00-21:30
(更新2026-04-08的work_shifts为两个时段)
用户:下周四的晚班时间改成16:30开始
技能:/update_schedule 2026-04-09 晚班,16:30-23:00
(更新2026-04-09的晚班开始时间)
用户:查看下周排班
技能:/show_schedule 2026-04-06 2026-04-12 table
(以表格形式显示下周排班)
### 场景四:自动时段匹配
用户:添加每周四的午间提醒任务
技能:系统会检查周四的排班:
如果是早晚班:建议在between_shifts时段提醒
如果是单时段班:建议在午休时间(12:00-13:00)提醒
会询问:您希望将提醒设置在哪个时段?
## 提醒计算逻辑
### 1. 时段选择策略
系统根据任务类型和排班自动选择最合适的时段:
| 任务类型/时间 | 单时段(早班) | 单时段(晚班) | 多时段(早晚班) |
|---------------|---------------|---------------|------------------|
| 早晨任务 | before_shift_start | before_shift_start | before_first_shift_start |
| 午间任务 | fixed_time:12:00 | fixed_time:12:00 | between_shifts |
| 晚间任务 | after_shift_end | before_shift_start | before_second_shift_start |
| 休息日任务 | fixed_time:09:00 | fixed_time:09:00 | fixed_time:09:00 |
### 2. 时间计算示例
- **早晚班**(09:30-11:30,16:00-21:30):
- `before_first_shift_start:30` → 09:00提醒
- `between_shifts:60` → 11:30提醒(第一时段结束后,第二时段开始前60分钟)
- `before_second_shift_start:15` → 15:45提醒
- `after_second_shift_end:30` → 22:00提醒
- **晚班**(15:30-22:30):
- `before_shift_start:45` → 14:45提醒
- `after_shift_start:60` → 16:30提醒
- `after_shift_end:30` → 23:00提醒
## 注意事项
1. **多时段处理**:对于早晚班,系统会识别两个时段之间的间隔,`between_shifts`规则会自动在两时段之间设置提醒。
2. **时段索引**:`shift_index`从0开始,0表示第一个工作时段,1表示第二个工作时段。
3. **自动时段选择**:如果不指定具体时段,系统会根据任务描述和时间自动选择最合适的时段。
4. **休息日处理**:如果某天没有排班记录,视为休息日,使用默认的固定时间提醒。
5. **时间冲突检测**:如果计算的提醒时间与工作时间冲突,系统会自动调整。
## 故障排除
- **排班表导入失败**:
1. 检查文件格式是否为支持的Excel(.xlsx/.xls)或CSV
2. 确认时间格式为HH:MM(24小时制)
3. 多时段排班确保时段之间不重叠
- **提醒时间计算错误**:
1. 检查当天的排班记录是否包含正确的工作时段
2. 确认提醒规则语法正确
3. 对于多时段,确保指定了正确的`shift_index`
- **自然语言修改不生效**:
1. 确保时段描述清晰,如"早晚班"或具体时间"9:30-11:30 16:00-21:30"
2. 修改后使用`/show_schedule`确认修改已生效
---
*提示:对于多时段工作,建议先用`/show_schedule`查看排班,再根据实际时段设置提醒规则。*
标签
skill
ai