From 240437d57ed32cf76423fec79ca52a15900b5521 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Fri, 21 Nov 2025 10:53:40 +0800 Subject: [PATCH] update --- .../Controllers/Admin/OtherController.php | 271 +++++++++++++++++- 1 file changed, 258 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index d590296..a39e6b1 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -175,7 +175,7 @@ class OtherController extends CommonController foreach ($suzhouArea as $item) { $suzhou[] = [ 'company_area' => $item->company_area, - 'company_total' => User::whereHas('company', function ($query) use ($item) { + 'total' => User::whereHas('company', function ($query) use ($item) { $query->where('company_area', $item->company_area); })->where('is_schoolmate', 1)->count() ]; @@ -221,18 +221,12 @@ class OtherController extends CommonController */ public function coursesHome() { - $start_date = request('start_date', CourseType::START_DATE); - $end_date = request('end_date', date('Y-m-d')); - $course_type_id = request('course_type_id', ''); - if ($course_type_id) { - // 部分 - $course_type_id = explode(',', $course_type_id); - } else { - // 全部 - $course_type_id = CourseType::pluck('id')->toArray(); - } - // 课程 - $courses = Course::whereIn('type', $course_type_id)->get(); + // 获取公共参数 + $params = $this->getCoursesHomeParams(); + $start_date = $params['start_date']; + $end_date = $params['end_date']; + $course_type_id = $params['course_type_id']; + $courses = $params['courses']; // 被投企业数 $list['course_signs_invested'] = CourseSign::yhInvested($start_date, $end_date); // 报名人数 @@ -274,6 +268,257 @@ class OtherController extends CommonController return $this->success(compact('list', 'courseTypesSum', 'areas')); } + /** + * @OA\Get( + * path="/api/admin/other/courses-home-export", + * tags={"其他"}, + * summary="课程统计明细导出", + * description="导出课程统计数据的明细", + * @OA\Parameter(name="export_type", in="query", @OA\Schema(type="string"), required=true, description="导出类型:invested_companies-被投企业明细, course_signs_total-报名人数明细, course_signs_pass-审核通过人数明细, course_signs_pass_unique-审核通过人数去重明细, course_types-课程分类明细, areas-区域明细"), + * @OA\Parameter(name="start_date", in="query", @OA\Schema(type="string"), required=false, description="开始日期"), + * @OA\Parameter(name="end_date", in="query", @OA\Schema(type="string"), required=false, description="结束日期"), + * @OA\Parameter(name="course_type_id", in="query", @OA\Schema(type="string"), required=false, description="课程体系id,多个英文逗号"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\Response( + * response="200", + * description="导出Excel文件" + * ) + * ) + */ + public function coursesHomeExport() + { + $export_type = request('export_type'); + if (!$export_type) { + return $this->fail([ResponseCode::ERROR_PARAMETER, '导出类型不能为空']); + } + + // 获取参数(与coursesHome保持一致) + $params = $this->getCoursesHomeParams(); + $start_date = $params['start_date']; + $end_date = $params['end_date']; + $course_type_id = $params['course_type_id']; + $courses = $params['courses']; + $course_ids = $courses->pluck('id'); + + $data = []; + $fields = []; + $filename = ''; + + switch ($export_type) { + case 'invested_companies': + // 被投企业明细 - 使用与coursesHome相同的算法 + $courseSigns = CourseSign::whereDate('created_at', '>=', $start_date) + ->whereDate('created_at', '<=', $end_date) + ->whereNotIn('status', [4, 5]) + ->get(); + $userIds = $courseSigns->pluck('user_id'); + $companies = Company::whereHas('users', function ($query) use ($userIds) { + $query->whereIn('id', $userIds); + })->where('is_yh_invested', 1)->get(); + + foreach ($companies as $company) { + $data[] = [ + 'company_name' => $company->company_name, + 'company_city' => $company->company_city ?? '', + 'company_area' => $company->company_area ?? '', + 'company_industry' => $company->company_industry ?? '', + 'company_fund' => $company->company_fund ?? 0, + 'valuation' => $company->valuation ?? 0, + ]; + } + $fields = [ + 'company_name' => '企业名称', + 'company_city' => '所在城市', + 'company_area' => '所在区域', + 'company_industry' => '所属行业', + 'company_fund' => '融资额', + 'valuation' => '估值', + ]; + $filename = '被投企业明细'; + break; + + case 'course_signs_total': + // 报名人数明细 - 使用courseSignsTotal方法获取列表(与coursesHome算法一致) + $courseSigns = CourseSign::courseSignsTotal($start_date, $end_date, null, $course_ids->isNotEmpty() ? $course_ids : null, null, true); + // 加载关联关系 + $courseSigns->load(['user', 'course']); + + foreach ($courseSigns as $sign) { + $data[] = [ + 'user_name' => $sign->user->name ?? '', + 'mobile' => $sign->user->mobile ?? '', + 'company_name' => $sign->user->company_name ?? '', + 'company_area' => $sign->user->company_area ?? '', + 'course_name' => $sign->course->name ?? '', + 'status_text' => $sign->status_text ?? '', + 'created_at' => $sign->created_at ? $sign->created_at->format('Y-m-d H:i:s') : '', + ]; + } + $fields = [ + 'user_name' => '学员姓名', + 'mobile' => '手机号', + 'company_name' => '企业名称', + 'company_area' => '所在区域', + 'course_name' => '课程名称', + 'status_text' => '审核状态', + 'created_at' => '报名时间', + ]; + $filename = '报名人数明细'; + break; + + case 'course_signs_pass': + // 审核通过人数明细 - 使用courseSignsTotal方法获取列表(与coursesHome算法一致) + $courseSigns = CourseSign::courseSignsTotal($start_date, $end_date, 1, $course_ids->isNotEmpty() ? $course_ids : null, null, true); + // 加载关联关系 + $courseSigns->load(['user', 'course']); + + foreach ($courseSigns as $sign) { + $data[] = [ + 'user_name' => $sign->user->name ?? '', + 'mobile' => $sign->user->mobile ?? '', + 'company_name' => $sign->user->company_name ?? '', + 'company_area' => $sign->user->company_area ?? '', + 'course_name' => $sign->course->name ?? '', + 'created_at' => $sign->created_at ? $sign->created_at->format('Y-m-d H:i:s') : '', + ]; + } + $fields = [ + 'user_name' => '学员姓名', + 'mobile' => '手机号', + 'company_name' => '企业名称', + 'company_area' => '所在区域', + 'course_name' => '课程名称', + 'created_at' => '报名时间', + ]; + $filename = '审核通过人数明细'; + break; + + case 'course_signs_pass_unique': + // 审核通过人数去重明细 - 使用courseSignsTotalByUnique方法获取列表 + $users = CourseSign::courseSignsTotalByUnique($start_date, $end_date, 1, $course_ids->isNotEmpty() ? $course_ids : null, null, true); + + foreach ($users as $user) { + // 获取该学员报名的课程列表(与coursesHome逻辑保持一致) + $userCourseSigns = CourseSign::where('user_id', $user->id) + ->whereDate('created_at', '>=', $start_date) + ->whereDate('created_at', '<=', $end_date) + ->where('status', 1) + ->where(function ($query) use ($course_ids) { + if ($course_ids->isNotEmpty()) { + $query->whereIn('course_id', $course_ids); + } + }) + ->whereNotIn('status', [4, 5]) + ->with('course') + ->get(); + $courseNames = $userCourseSigns->pluck('course.name')->filter()->unique()->implode('、'); + + $data[] = [ + 'user_name' => $user->name ?? '', + 'mobile' => $user->mobile ?? '', + 'company_name' => $user->company_name ?? '', + 'company_area' => $user->company_area ?? '', + 'company_industry' => $user->company_industry ?? '', + 'course_names' => $courseNames, + 'course_count' => $userCourseSigns->count(), + ]; + } + $fields = [ + 'user_name' => '学员姓名', + 'mobile' => '手机号', + 'company_name' => '企业名称', + 'company_area' => '所在区域', + 'company_industry' => '所属行业', + 'course_names' => '报名课程', + 'course_count' => '报名课程数', + ]; + $filename = '审核通过人数去重明细'; + break; + + case 'course_types': + // 课程分类明细 - 与coursesHome中的courseTypesSum逻辑保持一致 + $courseTypes = CourseType::whereIn('id', $course_type_id)->get(); + foreach ($courseTypes as $courseType) { + $courses2 = Course::where('type', $courseType->id)->get(); + foreach ($courses2 as $course) { + $data[] = [ + 'course_type' => $courseType->name, + 'course_name' => $course->name, + 'course_type_signs_pass' => CourseSign::courseSignsTotal($start_date, $end_date, 1, $courses2->pluck('id')), + 'course_type_signs_pass_unique' => CourseSign::courseSignsTotalByUnique($start_date, $end_date, 1, $courses2->pluck('id'), null), + 'course_signs_pass' => CourseSign::courseSignsTotal($start_date, $end_date, 1, [$course->id]), + ]; + } + } + $fields = [ + 'course_type' => '课程体系', + 'course_name' => '课程名称', + 'course_type_signs_pass' => '课程体系培养人数', + 'course_type_signs_pass_unique' => '课程体系去重培养人数', + 'course_signs_pass' => '课程培养人数', + ]; + $filename = '课程分类明细'; + break; + + case 'areas': + // 区域明细 - 与coursesHome中的areas逻辑保持一致 + $areas = ParameterDetail::where('parameter_id', 5)->get(); + foreach ($areas as $area) { + $data[] = [ + 'area_name' => $area->value, + 'course_signs_pass' => CourseSign::courseSignsTotal($start_date, $end_date, 1, $course_ids, $area->value), + 'course_signs_pass_unique' => CourseSign::courseSignsTotalByUnique($start_date, $end_date, 1, $course_ids, $area->value), + ]; + } + $fields = [ + 'area_name' => '区域名称', + 'course_signs_pass' => '培养人数', + 'course_signs_pass_unique' => '去重培养人数', + ]; + $filename = '区域明细'; + break; + + default: + return $this->fail([ResponseCode::ERROR_PARAMETER, '不支持的导出类型']); + } + + if (empty($data)) { + return $this->fail([ResponseCode::ERROR_PARAMETER, '暂无数据可导出']); + } + + return Excel::download( + new CommonExport($data, $fields), + $filename . '_' . date('YmdHis') . '.xlsx' + ); + } + + /** + * 获取coursesHome方法的公共参数(提取公共逻辑) + * @return array + */ + private function getCoursesHomeParams() + { + $start_date = request('start_date', CourseType::START_DATE); + $end_date = request('end_date', date('Y-m-d')); + $course_type_id = request('course_type_id', ''); + if ($course_type_id) { + // 部分 + $course_type_id = explode(',', $course_type_id); + } else { + // 全部 + $course_type_id = CourseType::pluck('id')->toArray(); + } + // 课程 + $courses = Course::whereIn('type', $course_type_id)->get(); + + return [ + 'start_date' => $start_date, + 'end_date' => $end_date, + 'course_type_id' => $course_type_id, + 'courses' => $courses, + ]; + } + /** * @OA\Post( * path="/api/admin/other/admin-user-list",