版本: v1.0.0 | 更新时间: 2026-03-31 | 状态: ✅ 可用
✅ 本文档可直接分享给同事
下载后直接发送,或者复制到团队文档中即可使用!
技术栈:
⚠️ 重要提示
不要随便拖空白工具!每个节点都有专门对应的工具类型,选择正确的工具才能正常运行。
🎯 所有处理节点都使用"代码节点(Python)"工具!
| 序号 | 节点名称 | 工具类型 | 难度 | 代码量 |
|---|---|---|---|---|
| 1 | 开始节点 | 开始节点(固定) | ⭐ | 无 |
| 2 | Excel解析 | 代码节点(Python) | ⭐⭐ | ~50行 |
| 3 | 数据初始化 | 代码节点(Python) | ⭐⭐⭐ | ~150行 |
| 4 | 构建适配矩阵 | 代码节点(Python) | ⭐⭐ | ~40行 |
| 5 | 课程分类 | 代码节点(Python) | ⭐ | ~30行 |
| 6 | UP检查课分配 | 代码节点(Python) | ⭐⭐ | ~60行 |
| 7 | 普通检查课分配 | 代码节点(Python) | ⭐⭐ | ~60行 |
| 8 | 特殊教员分配 | 代码节点(Python) | ⭐⭐⭐ | ~100行 |
| 9 | 普通教员分配 | 代码节点(Python) | ⭐⭐⭐⭐ | ~200行 |
| 10 | 降级补位 | 代码节点(Python) | ⭐⭐⭐ | ~80行 |
| 11 | 匀课均衡 | 代码节点(Python) | ⭐⭐⭐⭐⭐ | ~150行 |
| 12 | 结果统计 | 代码节点(Python) | ⭐⭐ | ~50行 |
| 13 | 格式化输出 | 代码节点(Python) | ⭐ | ~40行 |
| 14 | 结束节点 | 结束节点(固定) | ⭐ | 无 |
统计: 代码节点12个 + 开始/结束节点2个 = 总计14个节点
✅ 关键点:
| 错误类型 | 问题 | 后果 | 正确做法 |
|---|---|---|---|
| ❌ 错误1 | 使用"空白工具" | 代码无法执行 | 使用"代码节点(Python)" |
| ❌ 错误2 | 选择JavaScript语言 | 语法错误 | 选择Python语言 |
| ❌ 错误3 | 节点连接顺序不对 | 数据流向错误 | 严格按照1-14顺序连接 |
开始节点 ↓ Excel解析(代码节点) ↓ 数据初始化(代码节点) ↓ 构建适配矩阵(代码节点) ↓ 课程分类(代码节点) ↓ UP检查课分配(代码节点) ↓ 普通检查课分配(代码节点) ↓ 特殊教员分配(代码节点) ↓ 普通教员分配(代码节点) ↓ 降级补位(代码节点) ↓ 匀课均衡(代码节点) ↓ 结果统计(代码节点) ↓ 格式化输出(代码节点) ↓ 结束节点
输入: 4个Excel文件
中间数据: userMap, courseList, course_categories, scheduled_courses, results
输出: 格式化的排班结果文本
| 阶段 | 步骤 | 预计耗时 | 说明 |
|---|---|---|---|
| 阶段1 | 文件上传节点配置 | 0.5小时 | 配置开始节点输入参数 |
| 阶段2 | Excel解析节点 | 1小时 | 解析4个Excel文件 |
| 阶段3 | 数据初始化节点 | 2小时 | 构建userMap和courseList |
| 阶段4 | 排班核心节点(6个) | 8小时 | 实现核心排班逻辑 |
| 阶段5 | 匀课均衡节点 | 3小时 | 实现均衡算法 |
| 阶段6 | 统计和输出(2个) | 2小时 | 生成结果和统计 |
| 阶段7 | 测试验证 | 4小时 | 测试所有功能 |
| 阶段8 | 调试优化 | 4小时 | 修复问题优化性能 |
总预计耗时: 25小时
| TypeScript函数 | Python函数 | 说明 |
|---|---|---|
| initData() | init_data() | 数据初始化 |
| filterInstructorByQualification() | filter_by_qualification() | 资质筛选 |
| checkTimeConflict() | check_time_conflict() | 时间冲突检测 |
| checkSpecialRule() | check_special_rule() | 特殊规则检查 |
| generateSchedule() | generate_schedule() | 排班生成 |
SPECIAL_RULES = {
'instructors': {
'陈健': {
'max_monthly_sessions': 1,
'description': '每月仅1场'
},
'毛家良': {
'max_monthly_sessions': 9,
'description': '每月约8场'
},
'杨毅勇': {
'allowed_date_range': {'min': 16, 'max': 31},
'description': '仅下半月'
},
'张弘强': {
'allowed_date_range': {'min': 1, 'max': 5},
'description': '仅1-5日'
},
'王占兵': {
'allowed_time_ranges': [
{'start': 8, 'end': 12},
{'start': 12, 'end': 16}
],
'description': '仅早8点/午12点场'
}
}
}def check_time_conflict(instructor_name, course, user_map, scheduled_courses):
"""
检查时间冲突
"""
user_info = user_map.get(instructor_name)
if not user_info:
return True
start_time = course['start_time']
end_time = course['end_time']
# 规则1:预占时间冲突
for occupancy in user_info.get('occupy_list', []):
occupy_start = datetime.combine(
occupancy['date'].date(),
datetime.strptime(occupancy['start_time'], '%H:%M').time()
)
occupy_end = datetime.combine(
occupancy['date'].date(),
datetime.strptime(occupancy['end_time'], '%H:%M').time()
)
if check_overlap(start_time, end_time, occupy_start, occupy_end):
return True
# 规则2:24小时内≤2场,间隔≥2小时
last_24h = [
sc for sc in scheduled_courses
if sc['instructor_name'] == instructor_name
and sc['start_time'] >= start_time - timedelta(hours=24)
]
if len(last_24h) >= 2:
return True
if len(last_24h) == 1:
last_end = last_24h[0]['end_time']
interval = (start_time - last_end).total_seconds() / 60
if interval < 120:
return True
return False准备4个Excel测试文件:
A: 将复杂逻辑拆分为多个节点,或者优化代码性能。
A: 添加数据预处理逻辑,自动识别和转换格式。
A: 使用相同的测试数据在原系统和讯飞平台分别运行,对比结果。
A: 寻找替代库,或者自己实现所需功能。
A: 优化降级补位逻辑,放宽部分限制条件,增加适配教员数量。
本攻略由AI辅助生成,仅供参考。如有疑问,请联系技术团队。