thinkphp 维修接单可以用一条条件更新,把未指派的工单改为已接单。并发请求同时提交时,只有实际更新一行的请求算接单成功。
在已授权入口识别接单人
示例使用 ThinkPHP 8。工单表含 id、service_area_id、technician_id、status 和 accepted_at。入口已验证登录、接单资格和服务区权限。
// POST 入口中,两个身份字段由服务端权限层提供。
$accepted = $this->claimJob($jobId, $authorizedAreaId, $technicianId);
return $accepted
? json(['status' => 'assigned'])
: json(['message' => '工单不可接单'], 409);

基于会话的入口应使用项目现有 CSRF 校验。请求传入的工单 ID 也要先验证为正整数。
把未指派条件放进同一条更新
下面方法加入现有控制器或接单服务。
private function claimJob(int $jobId, int $areaId, int $technicianId): bool
{
$changed = \think\facade\Db::name('repair_jobs')
->where('id', $jobId)
->where('service_area_id', $areaId)
->where('status', 'pending')
->whereNull('technician_id')
->update([
'status' => 'assigned',
'technician_id' => $technicianId,
'accepted_at' => date('Y-m-d H:i:s'),
]);
return $changed === 1;
}

条件和写入由数据库一起执行。发通知等后续操作只能在接单成功后触发。
用两个账号检查并发结果
在测试环境准备一条同服务区待接工单,让两个有资格的账号同时提交。完成后查看保存的负责人。
SELECT id, status, technician_id, accepted_at FROM repair_jobs WHERE id = 42;
预期一个请求成功、另一个收到 409,最终只保存成功者的 ID。把测试工单 ID 替换为实际值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











