目录
- [⏳ 前情回顾](#⏳ 前情回顾)
- [🎯 本节目标](#🎯 本节目标)
- 第一步:教务"心脏"------数据结构设计
- 第二步:后台订单管理搭建
- 第三步:确认预约逻辑实现 (核心衔接)
- 最终效果
- [🚀 总结](#🚀 总结)
⏳ 前情回顾
在上一讲中,我们完成了支付闭环:从统一下单到支付回调。目前支付成功后,系统会自动更新订单为"已支付、待确认"状态。
今天,我们将聚焦于后台教务管理,引入系统"心脏"------签到/课消记录表,并实现管理员一键确认预约、同步生成排课记录的核心功能。
🎯 本节目标
- "核心心脏"架构理解 :深入理解
Attendances表作为教务枢纽的设计。 - 后台订单管理搭建:创建预约管理页面,配置数据表格与筛选。
- 确认预约逻辑实现 :编写
confirmBooking方法,实现订单状态更新与课表记录生成。
第一步:教务"心脏"------数据结构设计
既然我们已经确定了以 【签到/课消记录表】 为核心的架构,那么这张表就是整个教务系统的"心脏"。它连接了学员、排课、老师甚至财务课消。
学员课表
Attendances这张表记录了"谁、在什么时候、上了什么课、结果如何"。
| 字段名称 | 字段标识 | 类型 | 说明 |
|---|---|---|---|
| 关联学员 | child_id |
关联关系 | 关联 Children 表 |
| 关联排课 | schedule_id |
关联关系 | 关联 Schedule 表 |
| 关联订单 | booking_id |
关联关系 | 关联 Bookings 表 |
| 课程类型 | type |
枚举 | 1: 体验课, 2: 正课 |
| 上课日期 | lesson_date |
日期 | 冗余字段,方便快速查询 |
| 开始时间 | start_time |
文本 | 从排课表同步过来的时间点 |
| 状态 | status |
枚举 | 1: 待签到, 2: 到课, 3: 请假, 4: 旷课 |
| 预计消耗 | cost_count |
数字 | 本次上课预计消耗课时 (正课1.0, 体验课0) |
| 实际扣除 | actual_cost |
数字 | 老师点名后实际扣除的课时 |
| 执教老师 | teacher_id |
关联关系 | 从排课表同步的老师 ID |
| 数据来源 | source |
枚举 | 1: 计划任务, 2: 手动添加 |
| 确认时间 | confirm_time |
日期时间 | 老师点名确认的具体时间 |
| 课堂备注 | remark |
文本 | 老师填写的课堂表现或备注 |

第二步:后台订单管理搭建
打开管理后台,点击创建页面的图标

创建预约管理页面

添加布局组件

添加数据表格组件

数据模型选择学员课表,勾选场景

添加筛选条件

切换到布局模型,添加菜单

按照同样的操作继续创建预约管理,数据模型选择预约表
第三步:确认预约逻辑实现 (核心衔接)
当管理员点击"确认预约"时,系统需要同时完成"订单状态更新"和"写入课表记录"。
打开预约管理页面,在操作列添加按钮,修改为确认预约

在代码区添加自定义方法,方法名改为confirmBooking
javascript
export default async function ({ event, data }) {
const booking = data.target; // 获取当前行数据
console.log("booking",booking)
try {
$w.utils.showLoading({ title: '处理中...' });
// 1. 更新订单状态为"已确认"
await $w.cloud.callDataSource({
dataSourceName: 'Bookings',
methodName: 'wedaUpdateV2',
params: {
data: {
confirmStatus: '2' // 已确认
},
filter: {
where: {
_id: { $eq: booking._id }
}
}
}
});
// 2. 写入"心脏"表 (Attendances)
// 从关联的排课信息中获取时间、日期、老师等冗余字段
await $w.cloud.callDataSource({
dataSourceName: 'Attendances',
methodName: 'wedaCreateV2',
params: {
data: {
child_id: { _id: booking.child_id._id },
schedule_id: { _id: booking.schedule_id._id },
booking_id: { _id: booking._id },
type: booking.type,
lesson_date: booking.schedule_id.date, // 同步日期
start_time: booking.schedule_id.startTime, // 同步时间
teacher_id: { _id: booking.teacher_id._id }, // 同步老师
status: '1', // 待签到
cost_count: booking.type === '1' ? 0 : 1, // 体验课不消课
source: '2' // 手动添加/后台触发
}
}
});
$w.utils.showToast({ title: '确认成功,已同步至课表', icon: 'success' });
$w.table1.refresh();
} catch (e) {
console.error("确认预约失败", e);
$w.utils.showToast({ title: '操作失败', icon: 'error' });
} finally {
$w.utils.hideLoading();
}
}
给按钮配置点击事件,调用我们的方法,传入所在行的数据

给按钮绑定条件展示,当确认排课等于1的时候显示

最终效果
教务登录系统看到一条排课信息

点击确认预约,自动将排课写入到学员课表表里

🚀 总结
通过本节课,我们确立了以 Attendances 表为核心的教务架构,并实现了从后台手动确认预约到生成课表记录的完整闭环。这为学员端查看课表打下了坚实的数据基础。
下一讲,我们将转战小程序端,实现:学员端"我的课表"展示与签到。