4.4 KiB
4.4 KiB
批量排班接口修复说明
问题描述
接口报错:
app\common\controller\BaseLikeAdminController::success():
Argument #2 ($data) must be of type array, bool given
问题原因
RosterLogic::batchSave() 方法返回 true(布尔值),但控制器的 success() 方法要求第二个参数必须是数组类型。
解决方案
1. 修改 Logic 层返回值
修改前:
public static function batchSave(array $params)
{
// ...
Db::commit();
return true; // 返回布尔值
}
修改后:
public static function batchSave(array $params)
{
// ...
Db::commit();
return [
'success_count' => $successCount,
'create_count' => $createCount,
'update_count' => $updateCount,
]; // 返回数组,包含统计信息
}
2. 修改控制器
修改前:
public function batchSave()
{
$params = (new RosterValidate())->post()->goCheck('batchSave');
$result = RosterLogic::batchSave($params);
return $this->success('批量保存成功', $result); // $result 是 bool
}
修改后:
public function batchSave()
{
$params = (new RosterValidate())->post()->goCheck('batchSave');
$result = RosterLogic::batchSave($params);
if ($result === false) {
return $this->fail(RosterLogic::getError());
}
return $this->success('批量保存成功', $result); // $result 是 array
}
改进内容
1. 返回统计信息
现在批量保存接口会返回详细的统计信息:
{
"code": 1,
"msg": "批量保存成功",
"data": {
"success_count": 20,
"create_count": 15,
"update_count": 5
}
}
success_count: 成功处理的记录数create_count: 新创建的记录数update_count: 更新的记录数
2. 错误处理
如果批量保存失败,会返回错误信息:
{
"code": 0,
"msg": "错误信息",
"data": []
}
3. 同样修复了 copy 方法
copy 方法也有同样的问题,已一并修复。
测试验证
测试1:批量创建
请求:
POST /adminapi/doctor.roster/batchSave
{
"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
}
]
}
响应:
{
"code": 1,
"msg": "批量保存成功",
"data": {
"success_count": 2,
"create_count": 2,
"update_count": 0
}
}
测试2:批量更新
再次执行相同的请求:
响应:
{
"code": 1,
"msg": "批量保存成功",
"data": {
"success_count": 2,
"create_count": 0,
"update_count": 2
}
}
相关文件
修改的文件:
server/app/adminapi/logic/doctor/RosterLogic.php- 修改返回值类型server/app/adminapi/controller/doctor/RosterController.php- 添加错误处理
注意事项
- 所有返回布尔值的 Logic 方法都应该检查是否会传递给
success()方法 - 如果需要返回数据,应该返回数组而不是布尔值
- 失败时应该使用
fail()方法而不是success()
最佳实践
Logic 层返回值规范
// ✅ 正确:返回数组或 false
public static function someMethod($params)
{
try {
// 处理逻辑
return ['id' => $id, 'count' => $count];
} catch (\Exception $e) {
self::setError($e->getMessage());
return false;
}
}
// ❌ 错误:返回 true
public static function someMethod($params)
{
try {
// 处理逻辑
return true; // 不要这样做
} catch (\Exception $e) {
return false;
}
}
控制器层处理规范
// ✅ 正确:检查返回值
public function someAction()
{
$result = SomeLogic::someMethod($params);
if ($result === false) {
return $this->fail(SomeLogic::getError());
}
return $this->success('操作成功', $result);
}
// ❌ 错误:直接传递布尔值
public function someAction()
{
$result = SomeLogic::someMethod($params);
return $this->success('操作成功', $result); // 如果 $result 是 bool 会报错
}
总结
问题已修复,批量排班接口现在可以正常工作,并且返回详细的统计信息。