'skipped', 'reason' => 'locked']; } // 创建锁文件 file_put_contents($lockFile, time()); try { Log::write('课程状态自动化任务开始' . date('Y-m-d H:i:s')); $result = $this->handleCourseStatus(); Log::write('课程状态自动化任务完成' . date('Y-m-d H:i:s')); return $result; } finally { // 删除锁文件 if (file_exists($lockFile)) { unlink($lockFile); } } } private function handleCourseStatus() { try { Db::startTrans(); // 批量更新,避免循环操作 $yesterday = date('Y-m-d', strtotime('-1 day')); // 先查询需要更新的记录数量 $totalCount = CourseSchedule::where('course_date', '<', date('Y-m-d')) ->where('status', '<>', 'completed') // 避免重复更新已完成的课程 ->count(); if ($totalCount == 0) { Log::write('没有需要更新状态的过期课程'); Db::commit(); return [ 'status' => 'success', 'total_count' => 0, 'updated_count' => 0, 'message' => '没有需要更新状态的过期课程' ]; } // 批量更新过期课程状态 $affectedRows = CourseSchedule::where('course_date', '<', date('Y-m-d')) ->where('status', '<>', 'completed') // 避免重复更新 ->update([ 'status' => 'completed', 'updated_at' => time() ]); Log::write('批量更新了' . $affectedRows . '个过期课程状态为已完成,总共检查了' . $totalCount . '个课程'); Db::commit(); return [ 'status' => 'success', 'total_count' => $totalCount, 'updated_count' => $affectedRows, 'message' => '成功更新' . $affectedRows . '个过期课程状态' ]; } catch (\Exception $e) { Db::rollback(); Log::write('更新课程状态失败:' . $e->getMessage()); return [ 'status' => 'failed', 'total_count' => 0, 'updated_count' => 0, 'error' => $e->getMessage() ]; } } }