|
|
@ -73,16 +73,24 @@ class CourseScheduleService extends BaseAdminService |
|
|
*/ |
|
|
*/ |
|
|
public function add(array $data) |
|
|
public function add(array $data) |
|
|
{ |
|
|
{ |
|
|
|
|
|
// 解析时间段,填充start_time和end_time字段 |
|
|
|
|
|
$timeData = $this->parseTimeSlot($data['time_slot']); |
|
|
|
|
|
|
|
|
$create = [ |
|
|
$create = [ |
|
|
'campus_id' => $data['campus_id'], |
|
|
'campus_id' => $data['campus_id'], |
|
|
'venue_id' => $data['venue_id'], |
|
|
'venue_id' => $data['venue_id'], |
|
|
'course_date' => $data['course_date'], |
|
|
'course_date' => $data['course_date'], |
|
|
'time_slot' => $data['time_slot'], |
|
|
'time_slot' => $data['time_slot'], |
|
|
|
|
|
'start_time' => $timeData ? $timeData['start_time'] : null, |
|
|
|
|
|
'end_time' => $timeData ? $timeData['end_time'] : null, |
|
|
'course_id' => $data['course_id'], |
|
|
'course_id' => $data['course_id'], |
|
|
'coach_id' => $data['coach_id'], |
|
|
'coach_id' => $data['coach_id'], |
|
|
'auto_schedule' => $data['auto_schedule'], |
|
|
'auto_schedule' => $data['auto_schedule'], |
|
|
'available_capacity' => (new Venue())->where('id', $data['venue_id'])->value('capacity') |
|
|
'available_capacity' => (new Venue())->where('id', $data['venue_id'])->value('capacity'), |
|
|
|
|
|
'status' => $this->determineInitialStatus($data['course_date'], $timeData), |
|
|
|
|
|
'created_by' => 'manual' |
|
|
]; |
|
|
]; |
|
|
|
|
|
|
|
|
$status = $this->model->where([ |
|
|
$status = $this->model->where([ |
|
|
['course_date', '=', $data['course_date']], |
|
|
['course_date', '=', $data['course_date']], |
|
|
['time_slot', '=', $data['time_slot']], |
|
|
['time_slot', '=', $data['time_slot']], |
|
|
@ -105,15 +113,22 @@ class CourseScheduleService extends BaseAdminService |
|
|
*/ |
|
|
*/ |
|
|
public function edit(int $id, array $data) |
|
|
public function edit(int $id, array $data) |
|
|
{ |
|
|
{ |
|
|
|
|
|
// 解析时间段,填充start_time和end_time字段 |
|
|
|
|
|
$timeData = $this->parseTimeSlot($data['time_slot']); |
|
|
|
|
|
|
|
|
$create = [ |
|
|
$create = [ |
|
|
'campus_id' => $data['campus_id'], |
|
|
'campus_id' => $data['campus_id'], |
|
|
'venue_id' => $data['venue_id'], |
|
|
'venue_id' => $data['venue_id'], |
|
|
'course_date' => $data['course_date'], |
|
|
'course_date' => $data['course_date'], |
|
|
'time_slot' => $data['time_slot'], |
|
|
'time_slot' => $data['time_slot'], |
|
|
|
|
|
'start_time' => $timeData ? $timeData['start_time'] : null, |
|
|
|
|
|
'end_time' => $timeData ? $timeData['end_time'] : null, |
|
|
'course_id' => $data['course_id'], |
|
|
'course_id' => $data['course_id'], |
|
|
'coach_id' => $data['coach_id'], |
|
|
'coach_id' => $data['coach_id'], |
|
|
'auto_schedule' => $data['auto_schedule'] |
|
|
'auto_schedule' => $data['auto_schedule'], |
|
|
|
|
|
'status' => $this->determineInitialStatus($data['course_date'], $timeData) |
|
|
]; |
|
|
]; |
|
|
|
|
|
|
|
|
$status = $this->model->where([ |
|
|
$status = $this->model->where([ |
|
|
['course_date', '=', $data['course_date']], |
|
|
['course_date', '=', $data['course_date']], |
|
|
['time_slot', '=', $data['time_slot']], |
|
|
['time_slot', '=', $data['time_slot']], |
|
|
@ -323,4 +338,77 @@ class CourseScheduleService extends BaseAdminService |
|
|
->where('id', $data)->findOrEmpty(); |
|
|
->where('id', $data)->findOrEmpty(); |
|
|
return $info->toArray(); |
|
|
return $info->toArray(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 解析time_slot字符串,提取开始和结束时间 |
|
|
|
|
|
* @param string $timeSlot 格式如 "09:00-10:30" |
|
|
|
|
|
* @return array|null |
|
|
|
|
|
*/ |
|
|
|
|
|
private function parseTimeSlot($timeSlot) |
|
|
|
|
|
{ |
|
|
|
|
|
if (empty($timeSlot)) { |
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 支持多种格式:09:00-10:30, 09:00~10:30, 9:00-10:30 |
|
|
|
|
|
if (preg_match('/(\d{1,2}:\d{2})\s*[-~~]\s*(\d{1,2}:\d{2})/', $timeSlot, $matches)) { |
|
|
|
|
|
return [ |
|
|
|
|
|
'start_time' => $matches[1], |
|
|
|
|
|
'end_time' => $matches[2] |
|
|
|
|
|
]; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 根据课程日期和时间段确定初始状态 |
|
|
|
|
|
* @param string $courseDate 课程日期 |
|
|
|
|
|
* @param array|null $timeData 时间数据 |
|
|
|
|
|
* @return string |
|
|
|
|
|
*/ |
|
|
|
|
|
private function determineInitialStatus($courseDate, $timeData) |
|
|
|
|
|
{ |
|
|
|
|
|
$currentDate = date('Y-m-d'); |
|
|
|
|
|
$currentTime = date('H:i:s'); |
|
|
|
|
|
|
|
|
|
|
|
// 如果是过去的日期,直接标记为已完成 |
|
|
|
|
|
if ($courseDate < $currentDate) { |
|
|
|
|
|
return 'completed'; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 如果是未来的日期,标记为待安排 |
|
|
|
|
|
if ($courseDate > $currentDate) { |
|
|
|
|
|
return 'pending'; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 如果是今天且有时间数据,根据时间判断状态 |
|
|
|
|
|
if ($courseDate === $currentDate && $timeData) { |
|
|
|
|
|
$startTime = $timeData['start_time']; |
|
|
|
|
|
$endTime = $timeData['end_time']; |
|
|
|
|
|
|
|
|
|
|
|
$currentTimestamp = strtotime($currentTime); |
|
|
|
|
|
$startTimestamp = strtotime($startTime); |
|
|
|
|
|
$endTimestamp = strtotime($endTime); |
|
|
|
|
|
|
|
|
|
|
|
// 如果当前时间在课程时间段内,状态为进行中 |
|
|
|
|
|
if ($currentTimestamp >= $startTimestamp && $currentTimestamp <= $endTimestamp) { |
|
|
|
|
|
return 'ongoing'; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 如果课程已结束,状态为已完成 |
|
|
|
|
|
if ($currentTimestamp > $endTimestamp) { |
|
|
|
|
|
return 'completed'; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 如果距离开始时间不足6小时,状态为即将开始 |
|
|
|
|
|
$timeDiff = $startTimestamp - $currentTimestamp; |
|
|
|
|
|
if ($timeDiff <= 6 * 3600 && $timeDiff > 0) { |
|
|
|
|
|
return 'upcoming'; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 其他情况默认为待安排 |
|
|
|
|
|
return 'pending'; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|