diff --git a/niucloud/app/api/controller/apiController/CourseSchedule.php b/niucloud/app/api/controller/apiController/CourseSchedule.php index 15378776..f1986717 100644 --- a/niucloud/app/api/controller/apiController/CourseSchedule.php +++ b/niucloud/app/api/controller/apiController/CourseSchedule.php @@ -70,7 +70,7 @@ class CourseSchedule extends BaseApiService ["remarks", ""], ["created_by", "manual"] ]); - + // 验证必填字段 $required = ['campus_id', 'venue_id', 'course_date', 'time_slot', 'course_id', 'coach_id', 'available_capacity']; foreach ($required as $field) { @@ -78,7 +78,7 @@ class CourseSchedule extends BaseApiService return fail("字段 {$field} 不能为空"); } } - + $result = (new CourseScheduleService())->createCourseSchedule($data); if (!$result['code']) { return fail($result['msg']); @@ -149,12 +149,12 @@ class CourseSchedule extends BaseApiService ["keyword", ""], // 场地名称关键词搜索 ["status", 1] // 状态筛选,默认获取可用场地 ]); - + $result = (new CourseScheduleService())->getVenueListForSchedule($data); if (!$result['code']) { return fail($result['msg']); } - + return success('获取成功', $result['data']); } catch (\Exception $e) { return fail('获取场地列表失败:' . $e->getMessage()); @@ -173,20 +173,20 @@ class CourseSchedule extends BaseApiService ["venue_id", 0], ["date", ""] ]); - + if (empty($data['venue_id'])) { return fail('场地ID不能为空'); } - + if (empty($data['date'])) { return fail('查询日期不能为空'); } - + $result = (new CourseScheduleService())->getVenueAvailableTimeSlots($data); if (!$result['code']) { return fail($result['msg']); } - + return success('获取成功', $result['data']); } catch (\Exception $e) { return fail('获取场地可用时间失败:' . $e->getMessage()); @@ -323,6 +323,7 @@ class CourseSchedule extends BaseApiService ["class_photo", ""] ]); + if (empty($data['schedule_id'])) { return fail('课程安排ID不能为空'); } @@ -383,4 +384,4 @@ class CourseSchedule extends BaseApiService return fail('签到失败:' . $e->getMessage()); } } -} \ No newline at end of file +} diff --git a/niucloud/app/api/controller/apiController/CustomerResources.php b/niucloud/app/api/controller/apiController/CustomerResources.php index e8883d1f..5ac36af0 100644 --- a/niucloud/app/api/controller/apiController/CustomerResources.php +++ b/niucloud/app/api/controller/apiController/CustomerResources.php @@ -138,7 +138,8 @@ class CustomerResources extends BaseApiService "headimg" => '', // 默认空字符串 "trial_class_count" => 2, // 默认2 "status" => 1, // 状态设置为1 - "created_person_id" => $request->param('staff_id', 0), // 当前登录人 + "created_person_id" => $request->param('staff_id', 0), // 当前登录人, + "contact_phone" => $customer_resources_data['phone_number'] ]; // 获取当前登录人的staff_id diff --git a/niucloud/app/api/route/route.php b/niucloud/app/api/route/route.php index 5eb96530..722b19a3 100644 --- a/niucloud/app/api/route/route.php +++ b/niucloud/app/api/route/route.php @@ -355,6 +355,7 @@ Route::group(function () { //员工端-单个学员签到 Route::post('courseSchedule/updateStudentStatus', 'apiController.CourseSchedule/updateStudentStatus'); + // 课程安排统一选项接口(新增-支持校区过滤) //获取所有排课选项(统一接口-支持校区过滤) Route::get('schedule/options/all', 'apiController.ScheduleOptions/getAllOptions'); diff --git a/niucloud/app/service/api/apiService/CourseScheduleService.php b/niucloud/app/service/api/apiService/CourseScheduleService.php index 72fe7c20..7e1085c7 100644 --- a/niucloud/app/service/api/apiService/CourseScheduleService.php +++ b/niucloud/app/service/api/apiService/CourseScheduleService.php @@ -39,7 +39,7 @@ class CourseScheduleService extends BaseApiService try { // 构建查询条件 $where = $this->buildScheduleWhere($data); - + // 分页参数 $page = intval($data['page'] ?? 1); $limit = intval($data['limit'] ?? 20); @@ -85,25 +85,25 @@ class CourseScheduleService extends BaseApiService foreach ($list as &$item) { // 解析时间段 $item['time_info'] = $this->parseTimeSlot($item['time_slot']); - + // 获取参与学员信息 $item['students'] = $this->getScheduleStudents($item['id']); - + // 获取助教信息 $item['assistants'] = $this->getScheduleAssistants($item['assistant_ids']); - + // 计算已报名人数 $item['enrolled_count'] = count($item['students']); - + // 计算剩余容量 $item['remaining_capacity'] = max(0, ($item['available_capacity'] ?? $item['venue_capacity']) - $item['enrolled_count']); - + // 格式化状态 $item['status_text'] = $this->getStatusText($item['status']); - + // 格式化创建方式 $item['created_by_text'] = $item['created_by'] == 'manual' ? '手动安排' : '系统创建'; - + // 处理图片路径 $item['coach_avatar'] = $item['coach_avatar'] ? $this->formatImageUrl($item['coach_avatar']) : ''; } @@ -238,7 +238,7 @@ class CourseScheduleService extends BaseApiService 'duration' => $this->calculateDuration(trim($startTime), trim($endTime)) ]; } - + return [ 'start_time' => $timeSlot, 'end_time' => '', @@ -403,7 +403,7 @@ class CourseScheduleService extends BaseApiService $domain = request()->domain(); return $domain . '/' . ltrim($imagePath, '/'); } - + /** * 获取筛选选项(教练、课程、班级等) * @param array $data 请求参数 @@ -420,34 +420,34 @@ class CourseScheduleService extends BaseApiService 'campuses' => [], // 校区列表 'status_options' => [] // 状态选项 ]; - + // 获取教练列表(基于教练部门dept_id=23) $result['coaches'] = $this->getCoachListWithPermission(); - + // 获取课程列表 $result['courses'] = Db::name('course') ->where('deleted_at', 0) ->field('id, course_name, course_type, duration') ->select() ->toArray(); - + // 获取班级列表 $result['classes'] = Db::name('class') ->where('deleted_at', 0) ->field('id, class_name, age_group, status') ->select() ->toArray(); - + // 获取场地列表(基于校区权限) $result['venues'] = $this->getVenueListWithPermission(); - + // 获取校区列表 $result['campuses'] = Db::name('campus') ->where('delete_time', 0) ->field('id, campus_name, campus_address') ->select() ->toArray(); - + // 状态选项 $result['status_options'] = [ ['value' => 'pending', 'label' => '待开始'], @@ -455,9 +455,9 @@ class CourseScheduleService extends BaseApiService ['value' => 'ongoing', 'label' => '进行中'], ['value' => 'completed', 'label' => '已结束'] ]; - + return $result; - + } catch (\Exception $e) { return [ 'coaches' => [], @@ -470,7 +470,7 @@ class CourseScheduleService extends BaseApiService ]; } } - + /** * 获取课程安排详情 * @param int $scheduleId 课程安排ID @@ -532,7 +532,7 @@ class CourseScheduleService extends BaseApiService // 处理图片路径 $schedule['coach_avatar'] = $schedule['coach_avatar'] ? $this->formatImageUrl($schedule['coach_avatar']) : ''; - + // 获取班级相关信息 if (!empty($schedule['class_id'])) { $schedule['class_info'] = Db::name('class') @@ -542,7 +542,7 @@ class CourseScheduleService extends BaseApiService } else { $schedule['class_info'] = null; } - + // 获取历史变更记录(注释掉,表不存在) // $schedule['change_history'] = Db::name('course_schedule_changes') // ->where('schedule_id', $scheduleId) @@ -550,7 +550,7 @@ class CourseScheduleService extends BaseApiService // ->select() // ->toArray(); $schedule['change_history'] = []; - + return $schedule; } catch (\Exception $e) { @@ -567,12 +567,12 @@ class CourseScheduleService extends BaseApiService { try { $where = []; - + // 场地名称关键词搜索 if (!empty($data['keyword'])) { $where[] = ['venue_name', 'like', '%' . $data['keyword'] . '%']; } - + // 校区筛选 if (!empty($data['campus_id'])) { $where[] = ['campus_id', '=', $data['campus_id']]; @@ -585,23 +585,23 @@ class CourseScheduleService extends BaseApiService if (isset($data['status'])) { $where[] = ['availability_status', '=', $data['status']]; } - + // 只获取未逻辑删除的场地 $where[] = ['deleted_at', '=', 0]; - + $venueList = Db::name('venue') ->where($where) ->field('id, venue_name, capacity, availability_status, time_range_type, time_range_start, time_range_end, fixed_time_ranges') ->order('created_at DESC') ->select() ->toArray(); - + return [ 'code' => 1, 'msg' => '获取成功', 'data' => $venueList ]; - + } catch (\Exception $e) { return [ 'code' => 0, @@ -621,13 +621,13 @@ class CourseScheduleService extends BaseApiService try { $venueId = $data['venue_id']; $date = $data['date']; - + // 获取场地信息 $venue = Db::name('venue') ->where('id', $venueId) ->where('availability_status', 1) ->find(); - + if (empty($venue)) { return [ 'code' => 0, @@ -635,28 +635,28 @@ class CourseScheduleService extends BaseApiService 'data' => [] ]; } - + // 根据场地时间类型获取可用时间段 $availableSlots = $this->generateTimeSlots($venue, $date); - + // 获取该场地该日期已安排的时间段 $occupiedSlots = Db::name('course_schedule') ->where('venue_id', $venueId) ->where('course_date', $date) ->where('deleted_at', 0) ->column('time_slot'); - + // 过滤已占用的时间段 $availableSlots = array_filter($availableSlots, function($slot) use ($occupiedSlots) { return !in_array($slot['time_slot'], $occupiedSlots); }); - + return [ 'code' => 1, 'msg' => '获取成功', 'data' => array_values($availableSlots) ]; - + } catch (\Exception $e) { return [ 'code' => 0, @@ -676,21 +676,21 @@ class CourseScheduleService extends BaseApiService try { // 开启事务 Db::startTrans(); - + // 验证场地时间冲突 $conflictCheck = $this->checkVenueConflict($data['venue_id'], $data['course_date'], $data['time_slot']); if (!$conflictCheck['code']) { Db::rollback(); return $conflictCheck; } - + // 验证教练时间冲突 $coachConflictCheck = $this->checkCoachConflict($data['coach_id'], $data['course_date'], $data['time_slot']); if (!$coachConflictCheck['code']) { Db::rollback(); return $coachConflictCheck; } - + // 准备插入数据 $insertData = [ 'campus_id' => $data['campus_id'], @@ -706,20 +706,20 @@ class CourseScheduleService extends BaseApiService 'updated_at' => date('Y-m-d H:i:s'), 'deleted_at' => 0 ]; - + // 如果传入了班级ID,则添加到插入数据中 if (!empty($data['class_id'])) { $insertData['class_id'] = $data['class_id']; } - + // 如果有备注,则添加 if (!empty($data['remarks'])) { $insertData['remarks'] = $data['remarks']; } - + // 插入课程安排 $scheduleId = Db::name('course_schedule')->insertGetId($insertData); - + if (!$scheduleId) { Db::rollback(); return [ @@ -727,10 +727,10 @@ class CourseScheduleService extends BaseApiService 'msg' => '创建课程安排失败' ]; } - + // 提交事务 Db::commit(); - + return [ 'code' => 1, 'msg' => '创建成功', @@ -738,7 +738,7 @@ class CourseScheduleService extends BaseApiService 'schedule_id' => $scheduleId ] ]; - + } catch (\Exception $e) { Db::rollback(); return [ @@ -757,13 +757,13 @@ class CourseScheduleService extends BaseApiService private function generateTimeSlots($venue, $date) { $slots = []; - + switch ($venue['time_range_type']) { case 'range': // 范围类型:从开始时间到结束时间,每小时一个时间段 $startTime = strtotime($venue['time_range_start']); $endTime = strtotime($venue['time_range_end']); - + for ($time = $startTime; $time < $endTime; $time += 3600) { $startTimeStr = date('H:i', $time); $endTimeStr = date('H:i', $time + 3600); @@ -774,7 +774,7 @@ class CourseScheduleService extends BaseApiService ]; } break; - + case 'fixed': // 固定时间范围类型 if (!empty($venue['fixed_time_ranges'])) { @@ -784,7 +784,7 @@ class CourseScheduleService extends BaseApiService // 兼容不同的字段名格式 $startTime = $range['start_time'] ?? $range['start'] ?? ''; $endTime = $range['end_time'] ?? $range['end'] ?? ''; - + if ($startTime && $endTime) { $slots[] = [ 'time_slot' => $startTime . '-' . $endTime, @@ -796,7 +796,7 @@ class CourseScheduleService extends BaseApiService } } break; - + case 'all': // 全天可用,生成默认时间段(8:00-22:00) for ($hour = 8; $hour < 22; $hour++) { @@ -810,7 +810,7 @@ class CourseScheduleService extends BaseApiService } break; } - + return $slots; } @@ -829,14 +829,14 @@ class CourseScheduleService extends BaseApiService ->where('time_slot', $timeSlot) ->where('deleted_at', 0) ->find(); - + if ($conflict) { return [ 'code' => 0, 'msg' => '该场地在该时间段已有课程安排' ]; } - + return ['code' => 1]; } @@ -855,14 +855,14 @@ class CourseScheduleService extends BaseApiService ->where('time_slot', $timeSlot) ->where('deleted_at', 0) ->find(); - + if ($conflict) { return [ 'code' => 0, 'msg' => '该教练在该时间段已有课程安排' ]; } - + return ['code' => 1]; } @@ -944,13 +944,13 @@ class CourseScheduleService extends BaseApiService Db::startTrans(); $scheduleId = $data['schedule_id']; - + // 查询当前课程安排信息 $currentSchedule = Db::name('course_schedule') ->where('id', $scheduleId) ->where('deleted_at', 0) ->find(); - + if (empty($currentSchedule)) { Db::rollback(); return [ @@ -991,7 +991,7 @@ class CourseScheduleService extends BaseApiService $venueId = $updateData['venue_id'] ?? $currentSchedule['venue_id']; $courseDate = $updateData['course_date'] ?? $currentSchedule['course_date']; $timeSlot = $updateData['time_slot'] ?? $currentSchedule['time_slot']; - + $conflictCheck = $this->checkVenueConflictForUpdate($venueId, $courseDate, $timeSlot, $scheduleId); if (!$conflictCheck['code']) { Db::rollback(); @@ -1004,7 +1004,7 @@ class CourseScheduleService extends BaseApiService $coachId = $updateData['coach_id'] ?? $currentSchedule['coach_id']; $courseDate = $updateData['course_date'] ?? $currentSchedule['course_date']; $timeSlot = $updateData['time_slot'] ?? $currentSchedule['time_slot']; - + $coachConflictCheck = $this->checkCoachConflictForUpdate($coachId, $courseDate, $timeSlot, $scheduleId); if (!$coachConflictCheck['code']) { Db::rollback(); @@ -1096,14 +1096,14 @@ class CourseScheduleService extends BaseApiService ->where('id', '<>', $excludeScheduleId) ->where('deleted_at', 0) ->find(); - + if ($conflict) { return [ 'code' => 0, 'msg' => '该场地在该时间段已有其他课程安排' ]; } - + return ['code' => 1]; } @@ -1124,14 +1124,14 @@ class CourseScheduleService extends BaseApiService ->where('id', '<>', $excludeScheduleId) ->where('deleted_at', 0) ->find(); - + if ($conflict) { return [ 'code' => 0, 'msg' => '该教练在该时间段已有其他课程安排' ]; } - + return ['code' => 1]; } @@ -1146,11 +1146,11 @@ class CourseScheduleService extends BaseApiService { try { $changes = []; - + // 比较字段变化 foreach ($newData as $field => $newValue) { if ($field == 'updated_at') continue; - + $oldValue = $oldData[$field] ?? null; if ($oldValue != $newValue) { $changes[] = [ @@ -1160,7 +1160,7 @@ class CourseScheduleService extends BaseApiService ]; } } - + if (!empty($changes)) { Db::name('course_schedule_changes')->insert([ 'schedule_id' => $scheduleId, @@ -1210,7 +1210,7 @@ class CourseScheduleService extends BaseApiService if (!empty($venue['time_range_start']) && !empty($venue['time_range_end'])) { $start = strtotime($venue['time_range_start']); $end = strtotime($venue['time_range_end']); - + // 每小时生成一个时间段 for ($time = $start; $time < $end; $time += 3600) { $startTimeStr = date('H:i', $time); @@ -1228,7 +1228,7 @@ class CourseScheduleService extends BaseApiService // 全天可用,默认8:30开始,每小时一档 $start = strtotime('08:30'); $end = strtotime('22:00'); - + // 每小时生成一个时间段,保持30分钟对齐 for ($time = $start; $time < $end; $time += 3600) { $startTimeStr = date('H:i', $time); @@ -1677,7 +1677,7 @@ class CourseScheduleService extends BaseApiService { try { $scheduleId = $data['schedule_id']; - + if (empty($scheduleId)) { return [ 'code' => 0, @@ -1685,7 +1685,7 @@ class CourseScheduleService extends BaseApiService 'data' => null ]; } - + // 获取课程基本信息 $scheduleInfo = Db::name('course_schedule') ->alias('cs') @@ -1705,7 +1705,7 @@ class CourseScheduleService extends BaseApiService 'cla.class_name' ]) ->find(); - + if (!$scheduleInfo) { return [ 'code' => 0, @@ -1713,7 +1713,7 @@ class CourseScheduleService extends BaseApiService 'data' => null ]; } - + // 获取学员列表 $students = Db::name('person_course_schedule') ->alias('pcs') @@ -1725,7 +1725,7 @@ class CourseScheduleService extends BaseApiService ->field([ 'pcs.id', 'pcs.person_id', - 'pcs.student_id', + 'pcs.student_id', 'pcs.resources_id', 'pcs.person_type', 'pcs.schedule_type', @@ -1742,31 +1742,31 @@ class CourseScheduleService extends BaseApiService ->group('pcs.id') // 防止重复数据 ->select() ->toArray(); - + // 分类处理学员数据 $formalStudents = []; $waitingStudents = []; - + foreach ($students as $student) { $studentData = $this->formatStudentDataForDetail($student); - + // 如果schedule_type为空,默认为等待位(2) $scheduleType = $student['schedule_type'] ?? 2; - + if ($scheduleType == 1) { $formalStudents[] = $studentData; } else { $waitingStudents[] = $studentData; } } - + // 计算空位 $maxFormalSeats = $scheduleInfo['max_students'] ?? 10; $maxWaitingSeats = 5; // 等待位默认5个 - + $formalEmptySeats = max(0, $maxFormalSeats - count($formalStudents)); $waitingEmptySeats = max(0, $maxWaitingSeats - count($waitingStudents)); - + return [ 'code' => 1, 'msg' => '获取成功', @@ -1778,7 +1778,7 @@ class CourseScheduleService extends BaseApiService 'waiting_empty_seats' => range(1, $waitingEmptySeats) ] ]; - + } catch (\Exception $e) { return [ 'code' => 0, @@ -1787,7 +1787,7 @@ class CourseScheduleService extends BaseApiService ]; } } - + /** * 格式化学员数据用于详情显示 * @param array $student 学员数据 @@ -1801,11 +1801,11 @@ class CourseScheduleService extends BaseApiService 'total' => $student['total_session_count'] ?? 0, 'percentage' => 0 ]; - + if ($courseProgress['total'] > 0) { $courseProgress['percentage'] = round(($courseProgress['used'] / $courseProgress['total']) * 100, 1); } - + // 转换数据库枚举值为前端期望的值 $personType = $student['person_type']; if ($personType === 'customer_resource') { @@ -1831,7 +1831,7 @@ class CourseScheduleService extends BaseApiService ] ]; } - + /** * 智能搜索学员 * @param array $data 搜索参数 @@ -1842,7 +1842,7 @@ class CourseScheduleService extends BaseApiService try { $phoneNumber = $data['phone_number'] ?? ''; $name = $data['name'] ?? ''; - + if (empty($phoneNumber) && empty($name)) { return [ 'code' => 1, @@ -1850,18 +1850,18 @@ class CourseScheduleService extends BaseApiService 'data' => [] ]; } - + $where = []; - + // 构建搜索条件 if (!empty($phoneNumber)) { $where[] = ['cr.phone_number', 'like', '%' . $phoneNumber . '%']; } - + if (!empty($name)) { $where[] = ['cr.name', 'like', '%' . $name . '%']; } - + // 搜索客户资源表 $results = Db::name('customer_resources') ->alias('cr') @@ -1884,13 +1884,13 @@ class CourseScheduleService extends BaseApiService ->limit(20) ->select() ->toArray(); - + // 处理结果数据 $searchResults = []; foreach ($results as $result) { // 判断学员类型:如果有正式的学员课程记录,则为正式学员;否则为客户资源 $person_type = !empty($result['student_course_id']) ? 'student' : 'resource'; - + $searchResults[] = [ 'id' => $result['resource_id'], 'name' => $result['name'], @@ -1910,13 +1910,13 @@ class CourseScheduleService extends BaseApiService ] ]; } - + return [ 'code' => 1, 'msg' => '搜索成功', 'data' => $searchResults ]; - + } catch (\Exception $e) { return [ 'code' => 0, @@ -1925,7 +1925,7 @@ class CourseScheduleService extends BaseApiService ]; } } - + /** * 删除学员/请假处理 * @param array $data 删除参数 @@ -1938,24 +1938,24 @@ class CourseScheduleService extends BaseApiService $personId = $data['person_id'] ?? 0; $personType = $data['person_type'] ?? ''; $reason = $data['reason'] ?? '删除学员'; - + if (empty($scheduleId) || empty($personId)) { return [ 'code' => 0, 'msg' => '参数不完整' ]; } - + // 开启事务 Db::startTrans(); - + // 查找学员记录 $enrollment = Db::name('person_course_schedule') ->where('schedule_id', $scheduleId) ->where('person_id', $personId) ->where('deleted_at', 0) ->find(); - + if (!$enrollment) { Db::rollback(); return [ @@ -1963,7 +1963,7 @@ class CourseScheduleService extends BaseApiService 'msg' => '找不到学员记录' ]; } - + // 判断是请假还是删除 if (strpos($reason, '请假') !== false) { // 请假处理:更新状态为请假 @@ -1984,7 +1984,7 @@ class CourseScheduleService extends BaseApiService 'remark' => $reason ]); } - + if ($result === false) { Db::rollback(); return [ @@ -1992,15 +1992,15 @@ class CourseScheduleService extends BaseApiService 'msg' => '删除失败' ]; } - + // 提交事务 Db::commit(); - + return [ 'code' => 1, 'msg' => '删除成功' ]; - + } catch (\Exception $e) { Db::rollback(); return [ @@ -2009,7 +2009,7 @@ class CourseScheduleService extends BaseApiService ]; } } - + /** * 添加学员到课程安排 * @param array $data 添加学员的数据 @@ -2021,28 +2021,28 @@ class CourseScheduleService extends BaseApiService $scheduleId = $data['schedule_id'] ?? 0; $personType = $data['person_type'] ?? ''; $scheduleType = $data['schedule_type'] ?? 2; // 默认等待位 - + if (empty($scheduleId) || empty($personType)) { return [ 'code' => 0, 'msg' => '课程安排ID和人员类型不能为空' ]; } - + // 转换前端传递的person_type为数据库枚举值 if ($personType === 'resource') { $personType = 'customer_resource'; } - + // 开启事务 Db::startTrans(); - + // 查询课程安排信息 $schedule = Db::name('course_schedule') ->where('id', $scheduleId) ->where('deleted_at', 0) ->find(); - + if (!$schedule) { Db::rollback(); return [ @@ -2050,7 +2050,7 @@ class CourseScheduleService extends BaseApiService 'msg' => '课程安排不存在或已被删除' ]; } - + // 准备插入数据 $insertData = [ 'schedule_id' => $scheduleId, @@ -2062,7 +2062,7 @@ class CourseScheduleService extends BaseApiService 'updated_at' => date('Y-m-d H:i:s'), 'deleted_at' => 0 ]; - + // 根据人员类型设置对应的ID if ($personType === 'student') { $studentId = $data['student_id'] ?? 0; @@ -2087,23 +2087,23 @@ class CourseScheduleService extends BaseApiService $insertData['resources_id'] = $resourcesId; $insertData['person_id'] = $resourcesId; } - + // 检查是否已经添加过 $whereCheck = [ 'schedule_id' => $scheduleId, 'deleted_at' => 0 ]; - + if ($personType === 'student') { $whereCheck['student_id'] = $insertData['student_id']; } else { $whereCheck['resources_id'] = $insertData['resources_id']; } - + $exists = Db::name('person_course_schedule') ->where($whereCheck) ->find(); - + if ($exists) { Db::rollback(); return [ @@ -2111,7 +2111,7 @@ class CourseScheduleService extends BaseApiService 'msg' => '该学员已经在此课程安排中' ]; } - + // 检查容量限制 if ($scheduleType == 1) { // 检查正式位容量 @@ -2120,7 +2120,7 @@ class CourseScheduleService extends BaseApiService ->where('schedule_type', 1) ->where('deleted_at', 0) ->count(); - + $maxStudents = intval($schedule['max_students'] ?? 10); if ($formalCount >= $maxStudents) { Db::rollback(); @@ -2136,7 +2136,7 @@ class CourseScheduleService extends BaseApiService ->where('schedule_type', 2) ->where('deleted_at', 0) ->count(); - + if ($waitingCount >= 5) { Db::rollback(); return [ @@ -2145,10 +2145,10 @@ class CourseScheduleService extends BaseApiService ]; } } - + // 插入学员记录 $result = Db::name('person_course_schedule')->insert($insertData); - + if (!$result) { Db::rollback(); return [ @@ -2156,15 +2156,15 @@ class CourseScheduleService extends BaseApiService 'msg' => '添加学员失败' ]; } - + // 提交事务 Db::commit(); - + return [ 'code' => 1, 'msg' => '添加学员成功' ]; - + } catch (\Exception $e) { Db::rollback(); return [ @@ -2186,14 +2186,14 @@ class CourseScheduleService extends BaseApiService $personId = $data['person_id'] ?? 0; $fromType = $data['from_type'] ?? 2; $toType = $data['to_type'] ?? 1; - + if (empty($scheduleId) || empty($personId)) { return [ 'code' => 0, 'msg' => '参数不完整' ]; } - + // 验证升级方向 if ($fromType != 2 || $toType != 1) { return [ @@ -2201,10 +2201,10 @@ class CourseScheduleService extends BaseApiService 'msg' => '只能从等待位升级到正式位' ]; } - + // 开启事务 Db::startTrans(); - + // 查找等待位学员记录 $enrollment = Db::name('person_course_schedule') ->where('schedule_id', $scheduleId) @@ -2212,7 +2212,7 @@ class CourseScheduleService extends BaseApiService ->where('schedule_type', 2) ->where('deleted_at', 0) ->find(); - + if (!$enrollment) { Db::rollback(); return [ @@ -2220,18 +2220,18 @@ class CourseScheduleService extends BaseApiService 'msg' => '找不到等待位学员记录' ]; } - + // 检查正式位容量 $schedule = Db::name('course_schedule') ->where('id', $scheduleId) ->find(); - + $formalCount = Db::name('person_course_schedule') ->where('schedule_id', $scheduleId) ->where('schedule_type', 1) ->where('deleted_at', 0) ->count(); - + $maxStudents = intval($schedule['max_students'] ?? 10); if ($formalCount >= $maxStudents) { Db::rollback(); @@ -2240,7 +2240,7 @@ class CourseScheduleService extends BaseApiService 'msg' => '正式位已满,无法升级' ]; } - + // 更新学员记录 $result = Db::name('person_course_schedule') ->where('id', $enrollment['id']) @@ -2250,7 +2250,7 @@ class CourseScheduleService extends BaseApiService 'updated_at' => date('Y-m-d H:i:s'), 'remark' => '从等待位升级为正式位' ]); - + if ($result === false) { Db::rollback(); return [ @@ -2258,15 +2258,15 @@ class CourseScheduleService extends BaseApiService 'msg' => '升级失败' ]; } - + // 提交事务 Db::commit(); - + return [ 'code' => 1, 'msg' => '升级成功' ]; - + } catch (\Exception $e) { Db::rollback(); return [ @@ -2403,7 +2403,7 @@ class CourseScheduleService extends BaseApiService ]; } } - + /** * 更新学员签到状态 * @param array $data 更新参数 @@ -2416,14 +2416,14 @@ class CourseScheduleService extends BaseApiService $personId = $data['person_id'] ?? 0; $status = $data['status'] ?? 0; $reason = $data['reason'] ?? ''; - + $resources_id = $data['resources_id'] ?? 0; if (empty($scheduleId) || empty($personId)) { return [ 'code' => 0, 'msg' => '参数不完整' ]; } - + // 验证状态值 if (!in_array($status, [0, 1, 2])) { return [ @@ -2431,12 +2431,13 @@ class CourseScheduleService extends BaseApiService 'msg' => '无效的状态值' ]; } - + + // 开启事务 Db::startTrans(); // 使用内部处理方法 - $result = $this->processSingleStudentSignIn($scheduleId, $personId, 0, $status, $reason); + $result = $this->processSingleStudentSignIn($scheduleId, $personId, $resources_id, $status, $reason); if (!$result['success']) { Db::rollback(); @@ -2448,12 +2449,12 @@ class CourseScheduleService extends BaseApiService // 提交事务 Db::commit(); - + return [ 'code' => 1, 'msg' => '更新成功' ]; - + } catch (\Exception $e) { Db::rollback(); return [ @@ -2462,7 +2463,7 @@ class CourseScheduleService extends BaseApiService ]; } } - + /** * 恢复学员(取消请假) * @param array $data 恢复参数 @@ -2473,24 +2474,24 @@ class CourseScheduleService extends BaseApiService try { $scheduleId = $data['schedule_id'] ?? 0; $personId = $data['person_id'] ?? 0; - + if (empty($scheduleId) || empty($personId)) { return [ 'code' => 0, 'msg' => '参数不完整' ]; } - + // 开启事务 Db::startTrans(); - + // 查找学员记录 $enrollment = Db::name('person_course_schedule') ->where('schedule_id', $scheduleId) ->where('person_id', $personId) ->where('deleted_at', 0) ->find(); - + if (!$enrollment) { Db::rollback(); return [ @@ -2498,7 +2499,7 @@ class CourseScheduleService extends BaseApiService 'msg' => '找不到学员记录' ]; } - + // 恢复学员状态 $result = Db::name('person_course_schedule') ->where('id', $enrollment['id']) @@ -2507,7 +2508,7 @@ class CourseScheduleService extends BaseApiService 'updated_at' => date('Y-m-d H:i:s'), 'remark' => '取消请假,恢复正常状态' ]); - + if ($result === false) { Db::rollback(); return [ @@ -2515,15 +2516,15 @@ class CourseScheduleService extends BaseApiService 'msg' => '恢复失败' ]; } - + // 提交事务 Db::commit(); - + return [ 'code' => 1, 'msg' => '恢复成功' ]; - + } catch (\Exception $e) { Db::rollback(); return [ @@ -2839,4 +2840,4 @@ class CourseScheduleService extends BaseApiService return ['success' => false, 'error' => $e->getMessage()]; } } -} \ No newline at end of file +} diff --git a/uniapp/api/apiRoute.js b/uniapp/api/apiRoute.js index db0aa5f7..ec5e737f 100644 --- a/uniapp/api/apiRoute.js +++ b/uniapp/api/apiRoute.js @@ -1223,7 +1223,7 @@ export default { // 提交课程点名 async submitScheduleSignIn(data = {}) { - return await http.post('/courseSchedule/signIn', data) + return await http.post('/courseSchedule/batchSignIn', data) }, //↓↓↓↓↓↓↓↓↓↓↓↓-----添加课程安排页面专用接口-----↓↓↓↓↓↓↓↓↓↓↓↓