8.0 KiB
8.0 KiB
批量排班接口测试
接口信息
URL: POST /adminapi/doctor.roster/batchSave
Content-Type: application/json
测试用例
测试1:批量创建工作日排班
为2位医生创建一周工作日的排班(周一至周五,上午和下午)。
请求体:
{
"rosters": [
{
"doctor_id": 1,
"date": "2026-03-02",
"period": "morning",
"status": 1,
"quota": 20,
"max_patients": 30,
"remark": "工作日排班"
},
{
"doctor_id": 1,
"date": "2026-03-02",
"period": "afternoon",
"status": 1,
"quota": 20,
"max_patients": 30,
"remark": "工作日排班"
},
{
"doctor_id": 1,
"date": "2026-03-03",
"period": "morning",
"status": 1,
"quota": 20,
"max_patients": 30,
"remark": "工作日排班"
},
{
"doctor_id": 1,
"date": "2026-03-03",
"period": "afternoon",
"status": 1,
"quota": 20,
"max_patients": 30,
"remark": "工作日排班"
},
{
"doctor_id": 2,
"date": "2026-03-02",
"period": "morning",
"status": 1,
"quota": 15,
"max_patients": 25,
"remark": "工作日排班"
},
{
"doctor_id": 2,
"date": "2026-03-02",
"period": "afternoon",
"status": 1,
"quota": 15,
"max_patients": 25,
"remark": "工作日排班"
}
]
}
预期结果:
{
"code": 1,
"msg": "批量保存成功",
"data": true
}
测试2:批量设置周末休息
为所有医生设置周末休息。
请求体:
{
"rosters": [
{
"doctor_id": 1,
"date": "2026-03-07",
"period": "morning",
"status": 3,
"quota": 0,
"max_patients": 0,
"remark": "周末休息"
},
{
"doctor_id": 1,
"date": "2026-03-07",
"period": "afternoon",
"status": 3,
"quota": 0,
"max_patients": 0,
"remark": "周末休息"
},
{
"doctor_id": 1,
"date": "2026-03-08",
"period": "morning",
"status": 3,
"quota": 0,
"max_patients": 0,
"remark": "周末休息"
},
{
"doctor_id": 1,
"date": "2026-03-08",
"period": "afternoon",
"status": 3,
"quota": 0,
"max_patients": 0,
"remark": "周末休息"
}
]
}
测试3:更新已存在的排班
如果某个排班已存在,应该更新而不是创建新记录。
第一次请求:
{
"rosters": [
{
"doctor_id": 1,
"date": "2026-03-04",
"period": "morning",
"status": 1,
"quota": 20,
"max_patients": 30
}
]
}
第二次请求(更新):
{
"rosters": [
{
"doctor_id": 1,
"date": "2026-03-04",
"period": "morning",
"status": 2,
"quota": 0,
"max_patients": 0,
"remark": "临时停诊"
}
]
}
预期结果: 第二次请求应该更新第一次创建的记录,而不是创建新记录。
测试4:空数组
请求体:
{
"rosters": []
}
预期结果: 应该返回成功,但不创建任何记录。
测试5:数据验证
请求体(缺少必填字段):
{
"rosters": [
{
"doctor_id": 1,
"date": "2026-03-04"
// 缺少 period 和 status
}
]
}
预期结果: 应该返回验证错误。
使用 cURL 测试
基本测试
curl -X POST http://your-domain/adminapi/doctor.roster/batchSave \
-H "Content-Type: application/json" \
-H "token: your-token-here" \
-d '{
"rosters": [
{
"doctor_id": 1,
"date": "2026-03-04",
"period": "morning",
"status": 1,
"quota": 20,
"max_patients": 30
}
]
}'
批量测试(10条记录)
curl -X POST http://your-domain/adminapi/doctor.roster/batchSave \
-H "Content-Type: application/json" \
-H "token: your-token-here" \
-d @batch_roster_data.json
batch_roster_data.json:
{
"rosters": [
{"doctor_id": 1, "date": "2026-03-04", "period": "morning", "status": 1, "quota": 20, "max_patients": 30},
{"doctor_id": 1, "date": "2026-03-04", "period": "afternoon", "status": 1, "quota": 20, "max_patients": 30},
{"doctor_id": 1, "date": "2026-03-05", "period": "morning", "status": 1, "quota": 20, "max_patients": 30},
{"doctor_id": 1, "date": "2026-03-05", "period": "afternoon", "status": 1, "quota": 20, "max_patients": 30},
{"doctor_id": 1, "date": "2026-03-06", "period": "morning", "status": 1, "quota": 20, "max_patients": 30},
{"doctor_id": 1, "date": "2026-03-06", "period": "afternoon", "status": 1, "quota": 20, "max_patients": 30},
{"doctor_id": 1, "date": "2026-03-07", "period": "morning", "status": 3, "quota": 0, "max_patients": 0},
{"doctor_id": 1, "date": "2026-03-07", "period": "afternoon", "status": 3, "quota": 0, "max_patients": 0},
{"doctor_id": 1, "date": "2026-03-08", "period": "morning", "status": 3, "quota": 0, "max_patients": 0},
{"doctor_id": 1, "date": "2026-03-08", "period": "afternoon", "status": 3, "quota": 0, "max_patients": 0}
]
}
验证结果
1. 检查数据库
-- 查看批量创建的排班
SELECT * FROM la_doctor_roster
WHERE doctor_id = 1
AND date BETWEEN '2026-03-04' AND '2026-03-08'
ORDER BY date, period;
2. 检查唯一索引
-- 尝试插入重复记录,应该失败
INSERT INTO la_doctor_roster (doctor_id, date, period, status, create_time, update_time)
VALUES (1, '2026-03-04', 'morning', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
-- 错误: Duplicate entry '1-2026-03-04-morning' for key 'uk_doctor_date_period'
3. 检查更新逻辑
-- 第一次插入
-- 第二次用相同的 doctor_id, date, period 但不同的 status
-- 应该更新而不是插入新记录
SELECT COUNT(*) FROM la_doctor_roster
WHERE doctor_id = 1 AND date = '2026-03-04' AND period = 'morning';
-- 应该返回 1,不是 2
性能测试
测试100条记录
# 生成100条记录的JSON
php generate_test_data.php 100 > test_100.json
# 测试
time curl -X POST http://your-domain/adminapi/doctor.roster/batchSave \
-H "Content-Type: application/json" \
-H "token: your-token-here" \
-d @test_100.json
预期: 应该在2秒内完成
测试500条记录
php generate_test_data.php 500 > test_500.json
time curl -X POST http://your-domain/adminapi/doctor.roster/batchSave \
-H "Content-Type: application/json" \
-H "token: your-token-here" \
-d @test_500.json
预期: 应该在10秒内完成
错误处理测试
1. 事务回滚测试
在批量数据中插入一条错误数据,整个批量操作应该回滚。
{
"rosters": [
{
"doctor_id": 1,
"date": "2026-03-04",
"period": "morning",
"status": 1,
"quota": 20,
"max_patients": 30
},
{
"doctor_id": 999999,
"date": "2026-03-04",
"period": "morning",
"status": 1,
"quota": 20,
"max_patients": 30
}
]
}
预期: 如果第二条记录失败,第一条也不应该被保存。
2. 日期格式错误
{
"rosters": [
{
"doctor_id": 1,
"date": "2026/03/04",
"period": "morning",
"status": 1,
"quota": 20,
"max_patients": 30
}
]
}
预期: 返回日期格式错误
常见问题排查
问题1: 批量保存失败
检查:
- 数据库连接是否正常
- 表是否存在
- 字段类型是否匹配
- 唯一索引是否正确
问题2: 部分记录保存失败
检查:
- 查看错误日志
- 检查是否有数据验证失败
- 检查是否有外键约束
问题3: 性能问题
优化:
- 减少单次批量的记录数
- 添加数据库索引
- 使用批量插入而不是循环插入
总结
批量排班接口已经完整实现,包括:
- ✅ 批量创建排班
- ✅ 批量更新排班
- ✅ 事务处理
- ✅ 数据验证
- ✅ 错误处理
可以正常使用了!