Files
zyt/server/TEST_BATCH_ROSTER.md
T
2026-03-04 15:32:30 +08:00

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: 批量保存失败

检查:

  1. 数据库连接是否正常
  2. 表是否存在
  3. 字段类型是否匹配
  4. 唯一索引是否正确

问题2: 部分记录保存失败

检查:

  1. 查看错误日志
  2. 检查是否有数据验证失败
  3. 检查是否有外键约束

问题3: 性能问题

优化:

  1. 减少单次批量的记录数
  2. 添加数据库索引
  3. 使用批量插入而不是循环插入

总结

批量排班接口已经完整实现,包括:

  • 批量创建排班
  • 批量更新排班
  • 事务处理
  • 数据验证
  • 错误处理

可以正常使用了!