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

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
  }
}

相关文件

修改的文件:

  1. server/app/adminapi/logic/doctor/RosterLogic.php - 修改返回值类型
  2. server/app/adminapi/controller/doctor/RosterController.php - 添加错误处理

注意事项

  1. 所有返回布尔值的 Logic 方法都应该检查是否会传递给 success() 方法
  2. 如果需要返回数据,应该返回数组而不是布尔值
  3. 失败时应该使用 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 会报错
}

总结

问题已修复,批量排班接口现在可以正常工作,并且返回详细的统计信息。