From 7dae46cda7b2dc47e4777dc40c0c410b5b0743a8 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Sat, 22 Nov 2025 16:40:55 +0800 Subject: [PATCH 01/19] update --- .../Controllers/Admin/CourseController.php | 191 +++++++++--------- 1 file changed, 99 insertions(+), 92 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseController.php b/app/Http/Controllers/Admin/CourseController.php index faa5aae..833c5b7 100755 --- a/app/Http/Controllers/Admin/CourseController.php +++ b/app/Http/Controllers/Admin/CourseController.php @@ -63,102 +63,109 @@ class CourseController extends BaseController $query->whereNotIn('status', [4, 5]); } ])->withCount([ - 'courseSigns as sign_pass_total' => function ($query) { - $query->where('status', 1)->whereHas('user'); - } - ])->withCount([ - 'courseSigns as sign_wait_total' => function ($query) { - $query->where('status', 0)->whereHas('user'); - } - ])->withCount([ - 'courseSigns as sign_fault_total' => function ($query) { - $query->where('status', 2)->whereHas('user'); - } - ])->withCount([ - 'courseSigns as sign_prepare_total' => function ($query) { - $query->where('status', 3)->whereHas('user'); - } - ])->withCount([ - 'courseSigns as sign_cancel_total' => function ($query) { - $query->where('status', 4)->whereHas('user'); - } - ])->withCount([ - 'courseSigns as sign_give_up_total' => function ($query) { - $query->where('status', 5)->whereHas('user'); - } - ])->withCount([ - 'courseSigns as sign_black_total' => function ($query) { - $query->where('status', 6)->whereHas('user'); - } - ])->where(function ($query) use ($all) { - if (isset($all['has_course_forms']) && !empty($all['has_course_forms'])) { - $query->whereHas('courseForms'); - } - if (isset($all['start_date'])) { - $query->where('start_date', '>=', $all['start_date']); - } - if (isset($all['end_date'])) { - $query->where('end_date', '<=', $all['end_date']); - } - if (isset($all['course_type_id'])) { - $course_type_id = explode(',', $all['course_type_id']); - $query->whereIn('type', $course_type_id); - } - if (isset($all['filter']) && !empty($all['filter'])) { - foreach ($all['filter'] as $condition) { - $key = $condition['key'] ?? null; - $op = $condition['op'] ?? null; - $value = $condition['value'] ?? null; - if (!isset($key) || !isset($op) || !isset($value)) { + 'courseSigns as sign_pass_total' => function ($query) { + $query->where('status', 1)->whereHas('user'); + } + ])->withCount([ + 'courseSigns as sign_wait_total' => function ($query) { + $query->where('status', 0)->whereHas('user'); + } + ])->withCount([ + 'courseSigns as sign_fault_total' => function ($query) { + $query->where('status', 2)->whereHas('user'); + } + ])->withCount([ + 'courseSigns as sign_prepare_total' => function ($query) { + $query->where('status', 3)->whereHas('user'); + } + ])->withCount([ + 'courseSigns as sign_cancel_total' => function ($query) { + $query->where('status', 4)->whereHas('user'); + } + ])->withCount([ + 'courseSigns as sign_give_up_total' => function ($query) { + $query->where('status', 5)->whereHas('user'); + } + ])->withCount([ + 'courseSigns as sign_black_total' => function ($query) { + $query->where('status', 6)->whereHas('user'); + } + ])->where(function ($query) use ($all) { + if (isset($all['has_course_forms']) && !empty($all['has_course_forms'])) { + $query->whereHas('courseForms'); + } + if (isset($all['start_date'])) { + $query->where('start_date', '>=', $all['start_date']); + } + if (isset($all['end_date'])) { + $query->where('end_date', '<=', $all['end_date']); + } + if (isset($all['course_type_id'])) { + $course_type_id = explode(',', $all['course_type_id']); + $query->whereIn('type', $course_type_id); + } + if (isset($all['filter']) && !empty($all['filter'])) { + foreach ($all['filter'] as $condition) { + $key = $condition['key'] ?? null; + $op = $condition['op'] ?? null; + $value = $condition['value'] ?? null; + if (!isset($key) || !isset($op) || !isset($value)) { + continue; + } + if ($key == 'start_date') { + list($from, $to) = explode(',', $value); + $query->where(function ($q) use ($from, $to) { + $q->whereBetween('start_date', [$from, $to])->orWhereBetween('end_date', [$from, $to]); + }); + } + + // 等于 + if ($op == 'eq') { + $query->where($key, $value); + } + // 不等于 + if ($op == 'neq') { + $query->where($key, '!=', $value); + } + // 大于 + if ($op == 'gt') { + $query->where($key, '>', $value); + } + // 大于等于 + if ($op == 'egt') { + $query->where($key, '>=', $value); + } + // 小于 + if ($op == 'lt') { + $query->where($key, '<', $value); + } + // 小于等于 + if ($op == 'elt') { + $query->where($key, '<=', $value); + } + // 模糊搜索 + if ($op == 'like') { + $query->where($key, 'like', '%' . $value . '%'); + } + // 否定模糊搜索 + if ($op == 'notlike') { + $query->where($key, 'not like', '%' . $value . '%'); + } + // 范围搜索 + if ($op == 'range') { + list($from, $to) = explode(',', $value); + if (empty($from) || empty($to)) { continue; } - // 等于 - if ($op == 'eq') { - $query->where($key, $value); - } - // 不等于 - if ($op == 'neq') { - $query->where($key, '!=', $value); - } - // 大于 - if ($op == 'gt') { - $query->where($key, '>', $value); - } - // 大于等于 - if ($op == 'egt') { - $query->where($key, '>=', $value); - } - // 小于 - if ($op == 'lt') { - $query->where($key, '<', $value); - } - // 小于等于 - if ($op == 'elt') { - $query->where($key, '<=', $value); - } - // 模糊搜索 - if ($op == 'like') { - $query->where($key, 'like', '%' . $value . '%'); - } - // 否定模糊搜索 - if ($op == 'notlike') { - $query->where($key, 'not like', '%' . $value . '%'); - } - // 范围搜索 - if ($op == 'range') { - list($from, $to) = explode(',', $value); - if (empty($from) || empty($to)) { - continue; - } - $query->whereBetween($key, [$from, $to]); - } - if ($op == 'in') { - $array = explode(',', $value); - $query->whereIn($key, $array); - } + $query->whereBetween($key, [$from, $to]); + } + if ($op == 'in') { + $array = explode(',', $value); + $query->whereIn($key, $array); } } - }); + } + }); $list = $list->orderBy($all['sort_name'] ?? 'sign_status', $all['sort_type'] ?? 'asc'); if (isset($all['is_export']) && !empty($all['is_export'])) { $list = $list->limit(5000)->get()->toArray(); From a17306d54e4dfe352c3c5746e8489dab438ef08c Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Sat, 22 Nov 2025 16:45:00 +0800 Subject: [PATCH 02/19] update --- app/Http/Controllers/Admin/CourseController.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseController.php b/app/Http/Controllers/Admin/CourseController.php index 833c5b7..479423e 100755 --- a/app/Http/Controllers/Admin/CourseController.php +++ b/app/Http/Controllers/Admin/CourseController.php @@ -112,12 +112,12 @@ class CourseController extends BaseController if (!isset($key) || !isset($op) || !isset($value)) { continue; } - if ($key == 'start_date') { - list($from, $to) = explode(',', $value); - $query->where(function ($q) use ($from, $to) { - $q->whereBetween('start_date', [$from, $to])->orWhereBetween('end_date', [$from, $to]); - }); - } +// if ($key == 'start_date') { +// list($from, $to) = explode(',', $value); +// $query->where(function ($q) use ($from, $to) { +// $q->whereBetween('start_date', [$from, $to])->orWhereBetween('end_date', [$from, $to]); +// }); +// } // 等于 if ($op == 'eq') { From 9ef70eb47a7358e1c1f3b1456786f67fb1f2e6af Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Sat, 22 Nov 2025 16:45:55 +0800 Subject: [PATCH 03/19] update --- app/Http/Controllers/Admin/CourseController.php | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Admin/CourseController.php b/app/Http/Controllers/Admin/CourseController.php index 479423e..2ecc06c 100755 --- a/app/Http/Controllers/Admin/CourseController.php +++ b/app/Http/Controllers/Admin/CourseController.php @@ -112,12 +112,13 @@ class CourseController extends BaseController if (!isset($key) || !isset($op) || !isset($value)) { continue; } -// if ($key == 'start_date') { -// list($from, $to) = explode(',', $value); -// $query->where(function ($q) use ($from, $to) { -// $q->whereBetween('start_date', [$from, $to])->orWhereBetween('end_date', [$from, $to]); -// }); -// } + if ($key == 'start_date') { + list($from, $to) = explode(',', $value); + $query->where(function ($q) use ($from, $to) { + $q->whereBetween('start_date', [$from, $to])->orWhereBetween('end_date', [$from, $to]); + }); + continue; + } // 等于 if ($op == 'eq') { From a3b4ebec2c5ccae24a5d436107c25a086fa40943 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 11:15:08 +0800 Subject: [PATCH 04/19] update --- .../Controllers/Admin/CompanyController.php | 23 +- .../Admin/HistoryCourseController.php | 224 ++++++++++++++++++ app/Models/HistoryCourse.php | 8 + ...025_11_24_103916_alert_companies_table.php | 33 +++ ...24_105100_create_history_courses_table.php | 42 ++++ routes/api.php | 7 + 6 files changed, 336 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Admin/HistoryCourseController.php create mode 100644 app/Models/HistoryCourse.php create mode 100644 database/migrations/2025_11_24_103916_alert_companies_table.php create mode 100644 database/migrations/2025_11_24_105100_create_history_courses_table.php diff --git a/app/Http/Controllers/Admin/CompanyController.php b/app/Http/Controllers/Admin/CompanyController.php index 3267e34..613293c 100644 --- a/app/Http/Controllers/Admin/CompanyController.php +++ b/app/Http/Controllers/Admin/CompanyController.php @@ -75,6 +75,10 @@ class CompanyController extends BaseController * @OA\Parameter(name="sort_name", in="query", @OA\Schema(type="string"), required=false, description="排序字段名字"), * @OA\Parameter(name="sort_type", in="query", @OA\Schema(type="string"), required=false, description="排序类型"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\Parameter(name="course_type_id", in="query", @OA\Schema(type="string"), required=true, description="课程体系id"), + * @OA\Parameter(name="course_name", in="query", @OA\Schema(type="string"), required=true, description="课程名称"), + * @OA\Parameter(name="user_name", in="query", @OA\Schema(type="string"), required=true, description="学员名称"), + * @OA\Parameter(name="is_schoolmate", in="query", @OA\Schema(type="string"), required=true, description="是否校友0否1是"), * @OA\Response( * response="200", * description="暂无" @@ -84,7 +88,23 @@ class CompanyController extends BaseController public function index() { $all = request()->all(); - $list = $this->model->with(['users' => function ($query) { + $list = $this->model->with(['users' => function ($query) use ($all) { + if (isset($all['course_type_id'])) { + $query->whereHas('courses', function ($q) use ($all) { + $q->where('type', $all['course_type_id']); + }); + } + if (isset($all['course_name'])) { + $query->whereHas('courses', function ($q) use ($all) { + $q->where('name', 'like', '%' . $all['course_name'] . '%'); + }); + } + if (isset($all['user_name'])) { + $query->where('username', 'like', '%' . $all['user_name'] . '%'); + } + if (isset($all['is_schoolmate'])) { + $query->where('is_schoolmate', $all['is_schoolmate']); + } $query->whereHas('courseSigns', function ($q) { $q->where('status', 1); })->with('courseSigns.course'); @@ -223,6 +243,7 @@ class CompanyController extends BaseController * @OA\Parameter(name="overseas_experience", in="query", @OA\Schema(type="string", nullable=true), description="海外经验"), * @OA\Parameter(name="sales_volume", in="query", @OA\Schema(type="string", nullable=true), description="销售额"), * @OA\Parameter(name="tag", in="query", @OA\Schema(type="string", nullable=true), description="标签,千企走访这类的数据"), + * @OA\Parameter(name="company_invested", in="query", @OA\Schema(type="string"), required=true, description="投资金额"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), * @OA\Response( * response="200", diff --git a/app/Http/Controllers/Admin/HistoryCourseController.php b/app/Http/Controllers/Admin/HistoryCourseController.php new file mode 100644 index 0000000..f038f49 --- /dev/null +++ b/app/Http/Controllers/Admin/HistoryCourseController.php @@ -0,0 +1,224 @@ +all(); + $list = $this->model->where(function ($query) use ($all) { + if (isset($all['filter']) && !empty($all['filter'])) { + foreach ($all['filter'] as $condition) { + $key = $condition['key'] ?? null; + $op = $condition['op'] ?? null; + $value = $condition['value'] ?? null; + if (!isset($key) || !isset($op) || !isset($value)) { + continue; + } + // 等于 + if ($op == 'eq') { + $query->where($key, $value); + } + // 不等于 + if ($op == 'neq') { + $query->where($key, '!=', $value); + } + // 大于 + if ($op == 'gt') { + $query->where($key, '>', $value); + } + // 大于等于 + if ($op == 'egt') { + $query->where($key, '>=', $value); + } + // 小于 + if ($op == 'lt') { + $query->where($key, '<', $value); + } + // 小于等于 + if ($op == 'elt') { + $query->where($key, '<=', $value); + } + // 模糊搜索 + if ($op == 'like') { + $query->where($key, 'like', '%' . $value . '%'); + } + // 否定模糊搜索 + if ($op == 'notlike') { + $query->where($key, 'not like', '%' . $value . '%'); + } + // 范围搜索 + if ($op == 'range') { + list($from, $to) = explode(',', $value); + if (empty($from) || empty($to)) { + continue; + } + $query->whereBetween($key, [$from, $to]); + } + } + } + })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc'); + if (isset($all['is_export']) && !empty($all['is_export'])) { + $list = $list->get()->toArray(); + $export_fields = $all['export_fields'] ?? []; + // 导出文件名字 + $tableName = $this->model->getTable(); + $filename = (new CustomForm())->getTableComment($tableName); + return Excel::download(new BaseExport($export_fields, $list, $tableName), $filename . date('YmdHis') . '.xlsx'); + } else { + // 输出 + $list = $list->paginate($all['page_size'] ?? 20); + } + return $this->success($list); + } + + /** + * @OA\Get( + * path="/api/admin/history-courses/show", + * tags={"历史课程"}, + * summary="详情", + * description="", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"), + * @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组,填写输出指定数据"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\Response( + * response="200", + * description="暂无" + * ) + * ) + */ + public function show() + { + $all = \request()->all(); + $messages = [ + 'id.required' => 'Id必填', + ]; + $validator = Validator::make($all, [ + 'id' => 'required' + ], $messages); + if ($validator->fails()) { + return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); + } + $detail = $this->model->find($all['id']); + return $this->success($detail); + } + + /** + * @OA\Post( + * path="/api/admin/history-courses/save", + * tags={"历史课程"}, + * summary="保存", + * description="", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="int"), required=false, description="Id(存在更新,不存在新增)"), + * @OA\Parameter(name="course_type", in="query", @OA\Schema(type="string"), required=true, description="课程体系名称"), + * @OA\Parameter(name="course_type_signs_pass", in="query", @OA\Schema(type="integer", format="int64"), required=false, description="培养人数未去重"), + * @OA\Parameter(name="course_type_signs_pass_unique", in="query", @OA\Schema(type="integer", format="int64"), required=false, description="培养人数去重"), + * @OA\Parameter(name="course_signs_pass", in="query", @OA\Schema(type="integer", format="int64"), required=false, description="课程培养人数"), + * @OA\Parameter(name="course_name", in="query", @OA\Schema(type="string", nullable=true), description="课程名称"), + * @OA\Parameter(name="start_time", in="query", @OA\Schema(type="string", format="date", nullable=true), description="开始时间"), + * @OA\Parameter(name="end_time", in="query", @OA\Schema(type="string", format="date", nullable=true), description="结束时间"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), + * @OA\Response( + * response="200", + * description="操作成功" + * ) + * ) + */ + public function save() + { + $all = \request()->all(); + DB::beginTransaction(); + try { + if (isset($all['id'])) { + $model = $this->model->find($all['id']); + if (empty($model)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '数据不存在']); + } + } else { + $model = $this->model; + $all['admin_id'] = $this->getUserId(); + $all['department_id'] = $this->getUser()->department_id; + } + $original = $model->getOriginal(); + $model->fill($all); + $model->save(); + DB::commit(); + return $this->success($model); + } catch (\Exception $exception) { + DB::rollBack(); + return $this->fail([$exception->getCode(), $exception->getMessage()]); + } + } + + /** + * @OA\Get( + * path="/api/admin/history-courses/destroy", + * tags={"历史课程"}, + * summary="删除", + * description="", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="string"), required=true, description="id"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\Response( + * response="200", + * description="暂无" + * ) + * ) + */ + public function destroy() + { + return parent::destroy(); + } + +} diff --git a/app/Models/HistoryCourse.php b/app/Models/HistoryCourse.php new file mode 100644 index 0000000..d0ac3e2 --- /dev/null +++ b/app/Models/HistoryCourse.php @@ -0,0 +1,8 @@ +decimal('company_invested', 10, 2)->default(0)->comment('已投资金额'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('companies', function (Blueprint $table) { + // + }); + } +}; diff --git a/database/migrations/2025_11_24_105100_create_history_courses_table.php b/database/migrations/2025_11_24_105100_create_history_courses_table.php new file mode 100644 index 0000000..3cebe22 --- /dev/null +++ b/database/migrations/2025_11_24_105100_create_history_courses_table.php @@ -0,0 +1,42 @@ +id(); + $table->string('course_type')->comment('课程体系名称'); + $table->integer('course_type_signs_pass')->default(0)->comment('培养人数未去重'); + $table->integer('course_type_signs_pass_unique')->default(0)->comment('培养人数去重'); + $table->integer('course_signs_pass')->default(0)->comment('课程培养人数'); + // 课程名称 + $table->string('course_name')->nullable()->comment('课程名称'); + // 开始时间 + $table->date('start_time')->nullable()->comment('开始时间'); + // 结束时间 + $table->date('end_time')->nullable()->comment('结束时间'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('history_courses'); + } +}; + diff --git a/routes/api.php b/routes/api.php index f5abbb4..8f25459 100755 --- a/routes/api.php +++ b/routes/api.php @@ -257,6 +257,13 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::post('time-event/save', [\App\Http\Controllers\Admin\TimeEventController::class, "save"]); Route::get('time-event/destroy', [\App\Http\Controllers\Admin\TimeEventController::class, "destroy"]); + // 历史课程 + Route::get('history-courses/index', [\App\Http\Controllers\Admin\HistoryCourseController::class, "index"]); + Route::get('history-courses/show', [\App\Http\Controllers\Admin\HistoryCourseController::class, "show"]); + Route::post('history-courses/save', [\App\Http\Controllers\Admin\HistoryCourseController::class, "save"]); + Route::get('history-courses/destroy', [\App\Http\Controllers\Admin\HistoryCourseController::class, "destroy"]); + + // 统计数据配置管理 Route::get('statistics-configs/index', [\App\Http\Controllers\Admin\StatisticsConfigController::class, "index"]); Route::get('statistics-config/show', [\App\Http\Controllers\Admin\StatisticsConfigController::class, "show"]); From 2008de40dde452dc196858ce11b44b93734a7ca3 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 13:14:46 +0800 Subject: [PATCH 05/19] update --- .../Admin/HistoryCourseController.php | 2 +- .../Controllers/Admin/OtherController.php | 19 +++++++++++ app/Models/CourseSign.php | 28 ++++++++++++++-- ...24_105100_create_history_courses_table.php | 2 +- ..._11_24_115101_alert_course_types_table.php | 32 +++++++++++++++++++ 5 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 database/migrations/2025_11_24_115101_alert_course_types_table.php diff --git a/app/Http/Controllers/Admin/HistoryCourseController.php b/app/Http/Controllers/Admin/HistoryCourseController.php index f038f49..68d848a 100644 --- a/app/Http/Controllers/Admin/HistoryCourseController.php +++ b/app/Http/Controllers/Admin/HistoryCourseController.php @@ -162,7 +162,7 @@ class HistoryCourseController extends BaseController * summary="保存", * description="", * @OA\Parameter(name="id", in="query", @OA\Schema(type="int"), required=false, description="Id(存在更新,不存在新增)"), - * @OA\Parameter(name="course_type", in="query", @OA\Schema(type="string"), required=true, description="课程体系名称"), + * @OA\Parameter(name="type", in="query", @OA\Schema(type="string"), required=true, description="课程体系id"), * @OA\Parameter(name="course_type_signs_pass", in="query", @OA\Schema(type="integer", format="int64"), required=false, description="培养人数未去重"), * @OA\Parameter(name="course_type_signs_pass_unique", in="query", @OA\Schema(type="integer", format="int64"), required=false, description="培养人数去重"), * @OA\Parameter(name="course_signs_pass", in="query", @OA\Schema(type="integer", format="int64"), required=false, description="课程培养人数"), diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 57985de..26f117e 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -15,6 +15,7 @@ use App\Models\CourseSign; use App\Models\CourseType; use App\Models\CustomFormField; use App\Models\Department; +use App\Models\HistoryCourse; use App\Models\ParameterDetail; use App\Models\SupplyDemand; use App\Models\TimeEvent; @@ -271,6 +272,24 @@ class OtherController extends CommonController ]; } } + // 附加历史课程数据 + $historyCourses = HistoryCourse::where(function ($query) use ($start_date, $end_date) { + // 开始结束日期的筛选。or查询 + $query->whereBetween('start_date', [$start_date, $end_date]) + ->orWhereBetween('end_date', [$start_date, $end_date]); + })->get(); + foreach ($historyCourses as $historyCourse) { + $courseTypesSum[] = [ + 'course_type' => $historyCourse->course_type, + // 培养人数 + 'course_type_signs_pass' => $historyCourse->course_type_signs_pass, + // 去重培养人数 + 'course_type_signs_pass_unique' => $historyCourse->course_type_signs_pass_unique, + 'course_name' => $historyCourse->course_name, + 'course_signs_pass' => $historyCourse->course_signs_pass, + ]; + } + // 区域明细统计 $areas = CourseSign::area($start_date, $end_date, 1, $courses->pluck('id'), true); return $this->success(compact('list', 'courseTypesSum', 'areas')); diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index eb0d8ec..d7244bd 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -105,8 +105,16 @@ class CourseSign extends SoftDeletesModel // 返回列表 return $total->get(); } else { + // 基础数据 + $baseTotal = $total->count(); + // 历史数据 + $historyTotal = HistoryCourse::where(function ($query) use ($start_date, $end_date) { + // 开始结束日期的筛选。or查询 + $query->whereBetween('start_date', [$start_date, $end_date]) + ->orWhereBetween('end_date', [$start_date, $end_date]); + })->where('type', request('course_type_id'))->sum('course_signs_total'); // 返回统计数据 - return $total->count(); + return $historyTotal + $baseTotal; } } @@ -141,8 +149,15 @@ class CourseSign extends SoftDeletesModel // 列表 return $user; } else { + $baseTotal = $user->count(); + // 历史数据 + $historyTotal = HistoryCourse::where(function ($query) use ($start_date, $end_date) { + // 开始结束日期的筛选。or查询 + $query->whereBetween('start_date', [$start_date, $end_date]) + ->orWhereBetween('end_date', [$start_date, $end_date]); + })->where('type', request('course_type_id'))->sum('course_type_signs_pass_unique'); // 统计数据 - return $user->count(); + return $baseTotal + $historyTotal; } } @@ -164,7 +179,14 @@ class CourseSign extends SoftDeletesModel return $list; } else { // 返回统计数据 - return $list->count(); + $baseTotal = $list->count(); + // 历史数据 + $historyTotal = HistoryCourse::where(function ($query) use ($start_date, $end_date) { + // 开始结束日期的筛选。or查询 + $query->whereBetween('start_date', [$start_date, $end_date]) + ->orWhereBetween('end_date', [$start_date, $end_date]); + })->where('type', request('course_type_id'))->sum('course_type_signs_pass_unique'); + return $baseTotal + $historyTotal; } } diff --git a/database/migrations/2025_11_24_105100_create_history_courses_table.php b/database/migrations/2025_11_24_105100_create_history_courses_table.php index 3cebe22..2cacc5c 100644 --- a/database/migrations/2025_11_24_105100_create_history_courses_table.php +++ b/database/migrations/2025_11_24_105100_create_history_courses_table.php @@ -14,7 +14,7 @@ return new class extends Migration { { Schema::create('history_courses', function (Blueprint $table) { $table->id(); - $table->string('course_type')->comment('课程体系名称'); + $table->string('type')->comment('课程体系ID'); $table->integer('course_type_signs_pass')->default(0)->comment('培养人数未去重'); $table->integer('course_type_signs_pass_unique')->default(0)->comment('培养人数去重'); $table->integer('course_signs_pass')->default(0)->comment('课程培养人数'); diff --git a/database/migrations/2025_11_24_115101_alert_course_types_table.php b/database/migrations/2025_11_24_115101_alert_course_types_table.php new file mode 100644 index 0000000..f12da01 --- /dev/null +++ b/database/migrations/2025_11_24_115101_alert_course_types_table.php @@ -0,0 +1,32 @@ +boolean('is_history')->default(false)->comment('是否历史课程0否1是'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('course_types', function (Blueprint $table) { + // + }); + } +}; From 0783f4ca09bec7e14abc87962dff8241c42bfaaa Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 13:23:55 +0800 Subject: [PATCH 06/19] update --- app/Http/Controllers/Admin/OtherController.php | 4 ++-- app/Models/CourseSign.php | 9 +-------- app/Models/HistoryCourse.php | 5 +++++ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 26f117e..ad1f09a 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -277,10 +277,10 @@ class OtherController extends CommonController // 开始结束日期的筛选。or查询 $query->whereBetween('start_date', [$start_date, $end_date]) ->orWhereBetween('end_date', [$start_date, $end_date]); - })->get(); + })->where('type', $course_type_id)->get(); foreach ($historyCourses as $historyCourse) { $courseTypesSum[] = [ - 'course_type' => $historyCourse->course_type, + 'course_type' => $historyCourse->typeDetail->name, // 培养人数 'course_type_signs_pass' => $historyCourse->course_type_signs_pass, // 去重培养人数 diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index d7244bd..9998575 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -179,14 +179,7 @@ class CourseSign extends SoftDeletesModel return $list; } else { // 返回统计数据 - $baseTotal = $list->count(); - // 历史数据 - $historyTotal = HistoryCourse::where(function ($query) use ($start_date, $end_date) { - // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); - })->where('type', request('course_type_id'))->sum('course_type_signs_pass_unique'); - return $baseTotal + $historyTotal; + return $list->count(); } } diff --git a/app/Models/HistoryCourse.php b/app/Models/HistoryCourse.php index d0ac3e2..4eb14bf 100644 --- a/app/Models/HistoryCourse.php +++ b/app/Models/HistoryCourse.php @@ -4,5 +4,10 @@ namespace App\Models; class HistoryCourse extends SoftDeletesModel { + + public function typeDetail() + { + return $this->hasOne(CourseType::class, 'id', 'type'); + } } From c2f17c450bbdae1bb95927fea093b2880e20c631 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 14:48:09 +0800 Subject: [PATCH 07/19] update --- .../Controllers/Admin/OtherController.php | 42 +-- app/Models/CourseSign.php | 240 +++++++++++------- 2 files changed, 172 insertions(+), 110 deletions(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index ad1f09a..a2f25b8 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -127,31 +127,19 @@ class OtherController extends CommonController // 今年新增校友数 $list['schoolmate_year'] = User::where('is_schoolmate', 1)->where('created_at', 'like', '%' . date('Y') . '%')->count(); // 投后企业 - $list['company_invested_total'] = Company::where('is_yh_invested', 1)->count(); - // 元和员工参与 + $list['company_invested_total'] = CourseSign::yhInvested(); // 元和员工参与企业 - $companyNameKeyword = ['元禾控股', '元禾原点', '元禾厚望', '元禾重元', '元禾璞华', '元禾谷风', '元禾绿柳', '元禾辰坤', '元禾沙湖', '禾裕集团', '苏州科服', '信诚管理咨询', '集成电路公司', '常州团队', '国企元禾']; - // 获取公司名字包含$companyNameKeyword任意数据的公司,需要模糊匹配 - $list['company_join_total'] = Company::where(function ($query) use ($companyNameKeyword) { - foreach ($companyNameKeyword as $item) { - $query->orWhere('company_name', 'like', '%' . $item . '%'); - } - })->count(); + $list['company_join_total'] = CourseSign::companyJoin(); // 全市干部参与企业 - $list['company_ganbu_total'] = Company::whereHas('users', function ($query) { - $query->where('from', '跟班学员'); - })->count(); + $list['company_ganbu_total'] = CourseSign::ganbu(); // 三个全覆盖 // 苏州头部企业 - $list['cover_head_total'] = Company::where('company_tag', 'like', '%' . '高新技术企业' . '%')->count(); + $list['cover_head_total'] = CourseSign::toubuqiye(); // 高层次人才 // 获取人才培训课程 - $renCaiCourseIds = Course::whereHas('typeDetail', function ($query) { - $query->where('name', '人才培训'); - })->pluck('id'); - $list['cover_rencai_total'] = CourseSign::whereIn('course_id', $renCaiCourseIds)->where('status', 1)->count(); + $list['cover_rencai_total'] = CourseSign::rencai(); // 重点上市公司 - $list['cover_stock_total'] = Company::where('company_market', 1)->count(); + $list['cover_stock_total'] = CourseSign::shangshi(); // 本月课程 $monthCourses = Calendar::with('course.teacher')->where('type', 1) ->where('date', 'like', '%' . date('Y-m') . '%') @@ -246,7 +234,7 @@ class OtherController extends CommonController // 跟班学员数(在指定时间范围内报名的学员中,from为'跟班学员'的数量) $course_ids = $courses->pluck('id'); - $list['ganbu_total'] = CourseSign::ganbu($start_date, $end_date, $course_ids); + $list['ganbu_total'] = CourseSign::genban($start_date, $end_date, $course_ids); // 今年上市公司数量(stock_date在今年) $list['company_market_year_total'] = Company::companyMarketYear($start_date, $end_date, $course_ids); @@ -254,6 +242,18 @@ class OtherController extends CommonController // 入学后上市公司数量(在指定时间范围内报名的学员所在公司中,在入学后上市的公司数量) $list['company_market_after_enrollment_total'] = CourseSign::companyMarketAfterEnrollment($start_date, $end_date, $course_ids); + // 元和员工参与企业 + $list['company_join_total'] = CourseSign::companyJoin($start_date, $end_date, $course_ids); + // 全市干部参与企业 + $list['company_ganbu_total'] = CourseSign::ganbu($start_date, $end_date, $course_ids); + // 苏州头部企业 + $list['cover_head_total'] = CourseSign::toubuqiye($start_date, $end_date, $course_ids); + // 高层次人才 + $list['cover_rencai_total'] = CourseSign::rencai($start_date, $end_date, $course_ids); + // 重点上市公司 + $list['cover_stock_total'] = CourseSign::shangshi($start_date, $end_date, $course_ids); + + // 课程分类明细统计 $courseTypesSum = []; $courseTypes = CourseType::whereIn('id', $course_type_id)->get(); @@ -422,7 +422,7 @@ class OtherController extends CommonController case 'course_signs_pass_unique': // 审核通过人数去重明细 - 使用courseSignsTotalByUnique方法获取列表 - $users = CourseSign::courseSignsTotalByUnique($start_date, $end_date, 1, $course_ids, null, true); + $users = CourseSign::courseSignsTotalByUnique($start_date, $end_date, 1, $course_ids, true); foreach ($users as $user) { // 获取该学员报名的课程列表(与coursesHome逻辑保持一致) $userCourseSigns = CourseSign::where('user_id', $user->id) @@ -546,7 +546,7 @@ class OtherController extends CommonController case 'ganbu_total': // 跟班学员明细 - 使用模型方法 - $users = CourseSign::ganbu($start_date, $end_date, $course_ids, true); + $users = CourseSign::genban($start_date, $end_date, $course_ids, true); foreach ($users as $user) { $data[] = [ 'name' => $user->username ?? '', diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index 9998575..789f857 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -74,14 +74,13 @@ class CourseSign extends SoftDeletesModel return $this->hasMany(ThirdAppointmentLog::class, 'course_sign_id', 'id'); } - /** - * 指定时间内的报名信息(未去重) + * 获取学员列表数据 */ - public static function courseSignsTotal($start_date, $end_date, $status = null, $course_ids = null, $area = null, $retList = false) + public static function getStudentList($start_date = null, $end_date = null, $status = null, $course_ids = null) { - $total = CourseSign::where(function ($query) use ($status, $course_ids) { - if (isset($status)) { + $baseQuery = CourseSign::where(function ($query) use ($course_ids, $status) { + if ($status) { $query->where('status', $status); } if (isset($course_ids)) { @@ -89,24 +88,27 @@ class CourseSign extends SoftDeletesModel } })->whereHas('course', function ($query) use ($start_date, $end_date) { // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); - })->whereHas('user', function ($query) use ($area) { -// if (isset($area)) { -// if ($area == '苏州市外') { -// $allArea = ParameterDetail::where('parameter_id', 5)->get(); -// $query->whereNotIn('company_area', $allArea->pluck('value')); -// } else { -// $query->where('company_area', $area); -// } -// } - })->whereNotIn('status', [4, 5]); + if ($start_date && $end_date) { + $query->whereBetween('start_date', [$start_date, $end_date]) + ->orWhereBetween('end_date', [$start_date, $end_date]); + } + })->whereNotIn('status', [4, 5, 6]); + return $baseQuery; + } + + + /** + * 指定时间内的报名信息(未去重) + */ + public static function courseSignsTotal($start_date, $end_date, $status = null, $course_ids = null, $retList = false) + { + $totalQuery = self::getStudentList($start_date, $end_date, $status, $course_ids); if ($retList) { // 返回列表 - return $total->get(); + return $totalQuery->get(); } else { // 基础数据 - $baseTotal = $total->count(); + $baseTotal = $totalQuery->count(); // 历史数据 $historyTotal = HistoryCourse::where(function ($query) use ($start_date, $end_date) { // 开始结束日期的筛选。or查询 @@ -121,30 +123,10 @@ class CourseSign extends SoftDeletesModel /** * 指定时间内的报名信息(去重) */ - public static function courseSignsTotalByUnique($start_date, $end_date, $status = null, $course_ids = null, $area = null, $retList = false) + public static function courseSignsTotalByUnique($start_date, $end_date, $status = null, $course_ids = null, $retList = false) { - $courseSignByType = CourseSign::whereHas('course', function ($query) use ($start_date, $end_date) { - // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); - })->whereHas('user', function ($query) use ($area) { -// if ($area) { -// if ($area == '苏州市外') { -// $allArea = ParameterDetail::where('parameter_id', 5)->get(); -// $query->whereNotIn('company_area', $allArea->pluck('value')); -// } else { -// $query->where('company_area', $area); -// } -// } - })->where(function ($query) use ($status, $course_ids) { - if (isset($status)) { - $query->where('status', $status); - } - if (isset($course_ids)) { - $query->whereIn('course_id', $course_ids); - } - })->whereNotIn('status', [4, 5])->get(); - $user = User::whereIn('id', $courseSignByType->pluck('user_id'))->groupBy('mobile')->get(); + $totalQuery = self::getStudentList($start_date, $end_date, $status, $course_ids); + $user = User::whereIn('id', $totalQuery->get()->pluck('user_id'))->groupBy('mobile')->get(); if ($retList) { // 列表 return $user; @@ -164,15 +146,11 @@ class CourseSign extends SoftDeletesModel /** * 指定时间内的被投企业 */ - public static function yhInvested($start_date, $end_date, $retList = false) + public static function yhInvested($start_date = null, $end_date = null, $retList = false) { - $courseSignByType = CourseSign::whereHas('course', function ($query) use ($start_date, $end_date) { - // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); - })->whereNotIn('status', [4, 5])->get(); - $list = Company::whereHas('users', function ($query) use ($courseSignByType) { - $query->whereIn('id', $courseSignByType->pluck('user_id')); + $courseSignByTypeQuery = self::getStudentList($start_date, $end_date, null, null); + $list = Company::whereHas('users', function ($query) use ($courseSignByTypeQuery) { + $query->whereIn('id', $courseSignByTypeQuery->get()->pluck('user_id')); })->where('is_yh_invested', 1)->get(); if ($retList) { // 返回列表 @@ -191,25 +169,17 @@ class CourseSign extends SoftDeletesModel * @param bool $retList 是否返回列表,false返回数量,true返回列表 * @return int|\Illuminate\Database\Eloquent\Collection */ - public static function ganbu($start_date, $end_date, $course_ids = null, $retList = false) + public static function genban($start_date, $end_date, $course_ids = null, $retList = false) { - $courseSignsForGanbu = self::whereHas('course', function ($query) use ($start_date, $end_date) { - // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); - })->where(function ($query) use ($course_ids) { - if ($course_ids) { - $query->whereIn('course_id', $course_ids); - } - })->whereNotIn('status', [4, 5]) - ->whereHas('user', function ($query) { - $query->where('from', '跟班学员'); - })->get(); + $courseSignsQuery = self::getStudentList($start_date, $end_date, null, $course_ids); + $courseSigns = $courseSignsQuery->whereHas('user', function ($query) { + $query->where('from', '跟班学员'); + })->get(); if ($retList) { - return User::with('company')->whereIn('id', $courseSignsForGanbu->pluck('user_id'))->get(); + return User::with('company')->whereIn('id', $courseSigns->pluck('user_id'))->get(); } else { - return User::whereIn('id', $courseSignsForGanbu->pluck('user_id'))->count(); + return User::whereIn('id', $courseSigns->pluck('user_id'))->count(); } } @@ -223,18 +193,8 @@ class CourseSign extends SoftDeletesModel */ public static function companyMarketAfterEnrollment($start_date, $end_date, $course_ids = null, $retList = false) { - $courseSignsForStock = self::whereHas('course', function ($query) use ($start_date, $end_date) { - // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); - })->where(function ($query) use ($course_ids) { - if ($course_ids) { - $query->whereIn('course_id', $course_ids); - } - })->whereNotIn('status', [4, 5]) - ->with('user.company') - ->get(); - + $courseSignsQuery = self::getStudentList($start_date, $end_date, null, $course_ids); + $courseSignsForStock = $courseSignsQuery->with('user.company')->get(); $companiesAfterEnrollment = []; foreach ($courseSignsForStock as $sign) { if ($sign->user && $sign->user->company && $sign->user->company->company_market == 1) { @@ -272,19 +232,9 @@ class CourseSign extends SoftDeletesModel */ public static function area($start_date, $end_date, $status = null, $course_ids = null, $retList = false) { + $courseSignsQuery = self::getStudentList($start_date, $end_date, $status, $course_ids); // 获取所有学员id - $courseSignList = CourseSign::where(function ($query) use ($status, $course_ids) { - if (isset($status)) { - $query->where('status', $status); - } - if (isset($course_ids)) { - $query->whereIn('course_id', $course_ids); - } - })->whereHas('course', function ($query) use ($start_date, $end_date) { - // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); - })->whereHas('user')->whereNotIn('status', [4, 5]); + $courseSignList = $courseSignsQuery->whereHas('user'); // 地区 $suzhouArea = Company::where('company_city', '苏州市')->pluck('company_area')->unique(); $list = []; @@ -325,5 +275,117 @@ class CourseSign extends SoftDeletesModel } } + /** + * 元和员工参与企业 + */ + public static function companyJoin($start_date = null, $end_date = null, $course_ids = null, $retList = false) + { + $courseSignsQuery = self::getStudentList($start_date, $end_date, 1, $course_ids); + $courseSignByType = $courseSignsQuery->get(); + + // 检测关键词 + $companyNameKeyword = [ + '元禾控股', '元禾原点', '元禾厚望', '元禾重元', + '元禾璞华', '元禾谷风', '元禾绿柳', '元禾辰坤', '元禾沙湖', + '禾裕集团', '苏州科服', '信诚管理咨询', + '集成电路公司', '常州团队', '国企元禾' + ]; + $list = Company::whereHas('users', function ($query) use ($courseSignByType, $companyNameKeyword) { + $query->whereIn('id', $courseSignByType->pluck('user_id')); + })->where(function ($query) use ($companyNameKeyword) { + foreach ($companyNameKeyword as $item) { + $query->orWhere('company_name', 'like', '%' . $item . '%'); + } + })->get(); + if ($retList) { + // 返回列表 + return $list; + } else { + // 返回统计数据 + return $list->count(); + } + } + + /** + * 干部参与(统计或列表) + * @param string $start_date 开始日期 + * @param string $end_date 结束日期 + * @param array|null $course_ids 课程ID数组,不传则统计所有课程 + * @param bool $retList 是否返回列表,false返回数量,true返回列表 + * @return int|\Illuminate\Database\Eloquent\Collection + */ + public static function ganbu($start_date = null, $end_date = null, $course_ids = null, $retList = false) + { + $courseSignsQuery = self::getStudentList($start_date, $end_date, 1, $course_ids); + $courseSigns = $courseSignsQuery->whereHas('user', function ($query) { + $query->where('from', '跟班学员'); + })->get(); + if ($retList) { + return User::with('company')->whereIn('id', $courseSigns->pluck('user_id'))->get(); + } else { + return User::whereIn('id', $courseSigns->pluck('user_id'))->count(); + } + } + + /** + * 头部企业(统计或列表) + * @param string $start_date 开始日期 + * @param string $end_date 结束日期 + * @param array|null $course_ids 课程ID数组,不传则统计所有课程 + * @param bool $retList 是否返回列表,false返回数量,true返回列表 + * @return int|\Illuminate\Database\Eloquent\Collection + */ + public static function toubuqiye($start_date = null, $end_date = null, $course_ids = null, $retList = false) + { + $courseSignsQuery = self::getStudentList($start_date, $end_date, 1, $course_ids); + $courseSignByType = $courseSignsQuery->get(); + $list = Company::whereHas('users', function ($query) use ($courseSignByType) { + $query->whereIn('id', $courseSignByType->pluck('user_id')); + })->where('company_tag', 'like', '%' . '高新技术企业' . '%')->get(); + if ($retList) { + // 返回列表 + return $list; + } else { + // 返回统计数据 + return $list->count(); + } + } + + /** + * 高层次人才 + */ + public static function rencai($start_date = null, $end_date = null, $course_ids = null, $retList = false) + { + $courseSignsQuery = self::getStudentList($start_date, $end_date, 1, $course_ids); + $courseSigns = $courseSignsQuery->whereHas('course', function ($query) use ($start_date, $end_date) { + $query->where('typeDetail', function ($q) { + $q->where('name', '人才培训'); + }); + })->get(); + if ($retList) { + return User::whereIn('id', $courseSigns->pluck('user_id'))->get(); + } else { + return User::whereIn('id', $courseSigns->pluck('user_id'))->count(); + } + + } + + /** + * 重点上市公司 + */ + public static function shangshi($start_date = null, $end_date = null, $course_ids = null, $retList = false) + { + $courseSignsQuery = self::getStudentList($start_date, $end_date, 1, $course_ids); + $list = Company::whereHas('users', function ($query) use ($courseSignsQuery) { + $query->whereIn('id', $courseSignsQuery->get()->pluck('user_id')); + })->where('company_market', 1)->get(); + if ($retList) { + return $list->get(); + } else { + return $list->count(); + } + + } + } From 6d7fc669273f2cde5ea334976715eab9be07503e Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 14:54:33 +0800 Subject: [PATCH 08/19] update --- .../Controllers/Admin/CompanyController.php | 1 - app/Models/CourseSign.php | 4 +-- ...025_11_24_103916_alert_companies_table.php | 33 ------------------- 3 files changed, 2 insertions(+), 36 deletions(-) delete mode 100644 database/migrations/2025_11_24_103916_alert_companies_table.php diff --git a/app/Http/Controllers/Admin/CompanyController.php b/app/Http/Controllers/Admin/CompanyController.php index 613293c..c64239e 100644 --- a/app/Http/Controllers/Admin/CompanyController.php +++ b/app/Http/Controllers/Admin/CompanyController.php @@ -243,7 +243,6 @@ class CompanyController extends BaseController * @OA\Parameter(name="overseas_experience", in="query", @OA\Schema(type="string", nullable=true), description="海外经验"), * @OA\Parameter(name="sales_volume", in="query", @OA\Schema(type="string", nullable=true), description="销售额"), * @OA\Parameter(name="tag", in="query", @OA\Schema(type="string", nullable=true), description="标签,千企走访这类的数据"), - * @OA\Parameter(name="company_invested", in="query", @OA\Schema(type="string"), required=true, description="投资金额"), * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"), * @OA\Response( * response="200", diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index 789f857..e6f9e46 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -114,7 +114,7 @@ class CourseSign extends SoftDeletesModel // 开始结束日期的筛选。or查询 $query->whereBetween('start_date', [$start_date, $end_date]) ->orWhereBetween('end_date', [$start_date, $end_date]); - })->where('type', request('course_type_id'))->sum('course_signs_total'); + })->where('type', request('course_type_id',0))->sum('course_signs_total'); // 返回统计数据 return $historyTotal + $baseTotal; } @@ -137,7 +137,7 @@ class CourseSign extends SoftDeletesModel // 开始结束日期的筛选。or查询 $query->whereBetween('start_date', [$start_date, $end_date]) ->orWhereBetween('end_date', [$start_date, $end_date]); - })->where('type', request('course_type_id'))->sum('course_type_signs_pass_unique'); + })->where('type', request('course_type_id',0))->sum('course_type_signs_pass_unique'); // 统计数据 return $baseTotal + $historyTotal; } diff --git a/database/migrations/2025_11_24_103916_alert_companies_table.php b/database/migrations/2025_11_24_103916_alert_companies_table.php deleted file mode 100644 index 0b46a00..0000000 --- a/database/migrations/2025_11_24_103916_alert_companies_table.php +++ /dev/null @@ -1,33 +0,0 @@ -decimal('company_invested', 10, 2)->default(0)->comment('已投资金额'); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::table('companies', function (Blueprint $table) { - // - }); - } -}; From a2aea9eed4047a99ad64038e819af1dedd5ba5de Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 14:56:02 +0800 Subject: [PATCH 09/19] update --- app/Models/CourseSign.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index e6f9e46..39091a7 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -114,7 +114,7 @@ class CourseSign extends SoftDeletesModel // 开始结束日期的筛选。or查询 $query->whereBetween('start_date', [$start_date, $end_date]) ->orWhereBetween('end_date', [$start_date, $end_date]); - })->where('type', request('course_type_id',0))->sum('course_signs_total'); + })->where('type', request('course_type_id',0))->sum('course_type_signs_pass'); // 返回统计数据 return $historyTotal + $baseTotal; } From a353b39ec5664629c1405d2aa4a8b1745f27fd7a Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 14:57:30 +0800 Subject: [PATCH 10/19] update --- app/Models/CourseSign.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index 39091a7..68caf5c 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -89,8 +89,8 @@ class CourseSign extends SoftDeletesModel })->whereHas('course', function ($query) use ($start_date, $end_date) { // 开始结束日期的筛选。or查询 if ($start_date && $end_date) { - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); + $query->whereBetween('start_time', [$start_date, $end_date]) + ->orWhereBetween('end_time', [$start_date, $end_date]); } })->whereNotIn('status', [4, 5, 6]); return $baseQuery; @@ -112,8 +112,8 @@ class CourseSign extends SoftDeletesModel // 历史数据 $historyTotal = HistoryCourse::where(function ($query) use ($start_date, $end_date) { // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); + $query->whereBetween('start_time', [$start_date, $end_date]) + ->orWhereBetween('end_time', [$start_date, $end_date]); })->where('type', request('course_type_id',0))->sum('course_type_signs_pass'); // 返回统计数据 return $historyTotal + $baseTotal; From f31508c0aa56de7d284d167b4dbf8d2f09e0a317 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 14:58:30 +0800 Subject: [PATCH 11/19] update --- app/Models/CourseSign.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index 68caf5c..87b1212 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -89,8 +89,8 @@ class CourseSign extends SoftDeletesModel })->whereHas('course', function ($query) use ($start_date, $end_date) { // 开始结束日期的筛选。or查询 if ($start_date && $end_date) { - $query->whereBetween('start_time', [$start_date, $end_date]) - ->orWhereBetween('end_time', [$start_date, $end_date]); + $query->whereBetween('start_date', [$start_date, $end_date]) + ->orWhereBetween('end_date', [$start_date, $end_date]); } })->whereNotIn('status', [4, 5, 6]); return $baseQuery; @@ -135,8 +135,8 @@ class CourseSign extends SoftDeletesModel // 历史数据 $historyTotal = HistoryCourse::where(function ($query) use ($start_date, $end_date) { // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); + $query->whereBetween('start_time', [$start_date, $end_date]) + ->orWhereBetween('end_time', [$start_date, $end_date]); })->where('type', request('course_type_id',0))->sum('course_type_signs_pass_unique'); // 统计数据 return $baseTotal + $historyTotal; From 2f4ab3b647feee4f66be509786c01e6b6786f56b Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 15:01:59 +0800 Subject: [PATCH 12/19] update --- app/Models/CourseSign.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index 87b1212..83bd3e9 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -114,7 +114,7 @@ class CourseSign extends SoftDeletesModel // 开始结束日期的筛选。or查询 $query->whereBetween('start_time', [$start_date, $end_date]) ->orWhereBetween('end_time', [$start_date, $end_date]); - })->where('type', request('course_type_id',0))->sum('course_type_signs_pass'); + })->where('type', request('course_type_id', 0))->sum('course_type_signs_pass'); // 返回统计数据 return $historyTotal + $baseTotal; } @@ -137,7 +137,7 @@ class CourseSign extends SoftDeletesModel // 开始结束日期的筛选。or查询 $query->whereBetween('start_time', [$start_date, $end_date]) ->orWhereBetween('end_time', [$start_date, $end_date]); - })->where('type', request('course_type_id',0))->sum('course_type_signs_pass_unique'); + })->where('type', request('course_type_id', 0))->sum('course_type_signs_pass_unique'); // 统计数据 return $baseTotal + $historyTotal; } @@ -357,7 +357,7 @@ class CourseSign extends SoftDeletesModel public static function rencai($start_date = null, $end_date = null, $course_ids = null, $retList = false) { $courseSignsQuery = self::getStudentList($start_date, $end_date, 1, $course_ids); - $courseSigns = $courseSignsQuery->whereHas('course', function ($query) use ($start_date, $end_date) { + $courseSigns = $courseSignsQuery->whereHas('course', function ($query) { $query->where('typeDetail', function ($q) { $q->where('name', '人才培训'); }); @@ -367,7 +367,6 @@ class CourseSign extends SoftDeletesModel } else { return User::whereIn('id', $courseSigns->pluck('user_id'))->count(); } - } /** From 4d19587fd5b661116986745d0030d18ca5f3c54d Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 15:03:06 +0800 Subject: [PATCH 13/19] update --- app/Models/CourseSign.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index 83bd3e9..0b9a65f 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -358,7 +358,7 @@ class CourseSign extends SoftDeletesModel { $courseSignsQuery = self::getStudentList($start_date, $end_date, 1, $course_ids); $courseSigns = $courseSignsQuery->whereHas('course', function ($query) { - $query->where('typeDetail', function ($q) { + $query->whereHas('typeDetail', function ($q) { $q->where('name', '人才培训'); }); })->get(); From 2382a33ce1978bcd3ccfe0f02bab1115bcc40e9a Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 15:06:07 +0800 Subject: [PATCH 14/19] update --- app/Http/Controllers/Admin/OtherController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index a2f25b8..09998b4 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -275,8 +275,8 @@ class OtherController extends CommonController // 附加历史课程数据 $historyCourses = HistoryCourse::where(function ($query) use ($start_date, $end_date) { // 开始结束日期的筛选。or查询 - $query->whereBetween('start_date', [$start_date, $end_date]) - ->orWhereBetween('end_date', [$start_date, $end_date]); + $query->whereBetween('start_time', [$start_date, $end_date]) + ->orWhereBetween('end_time', [$start_date, $end_date]); })->where('type', $course_type_id)->get(); foreach ($historyCourses as $historyCourse) { $courseTypesSum[] = [ From 7f4d81b1d902cc55c1371201aca0e2161d775f1b Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 15:09:53 +0800 Subject: [PATCH 15/19] update --- app/Http/Controllers/Admin/OtherController.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 09998b4..900178a 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -174,6 +174,12 @@ class OtherController extends CommonController $countryArea = Company::groupBy('company_city')->whereNotNull('company_city')->get(['company_city']); $country = []; foreach ($countryArea as $item) { + $total = User::whereHas('company', function ($query) use ($item) { + $query->where('company_city', $item->company_city); + })->where('is_schoolmate', 1)->count(); + if (empty($total)) { + continue; + } $country[] = [ 'area' => $item->company_city, 'total' => User::whereHas('company', function ($query) use ($item) { From 7b7cbf268541dd45a5016734bfe5c4e951a442fb Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 15:24:10 +0800 Subject: [PATCH 16/19] update --- .../Controllers/Admin/OtherController.php | 154 +++++++++++++++++- app/Models/CourseSign.php | 2 +- 2 files changed, 152 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 900178a..cd06e4e 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -250,8 +250,6 @@ class OtherController extends CommonController // 元和员工参与企业 $list['company_join_total'] = CourseSign::companyJoin($start_date, $end_date, $course_ids); - // 全市干部参与企业 - $list['company_ganbu_total'] = CourseSign::ganbu($start_date, $end_date, $course_ids); // 苏州头部企业 $list['cover_head_total'] = CourseSign::toubuqiye($start_date, $end_date, $course_ids); // 高层次人才 @@ -307,7 +305,7 @@ class OtherController extends CommonController * tags={"其他"}, * summary="课程统计明细导出", * description="导出课程统计数据的明细", - * @OA\Parameter(name="export_type", in="query", @OA\Schema(type="string"), required=true, description="导出类型:course_signs_invested-被投企业明细, course_signs_total-报名人数明细, course_signs_pass-审核通过人数明细, course_signs_pass_unique-审核通过人数去重明细, courseTypesSum-课程分类明细, areas-区域明细, company_market_total-上市公司明细, ganbu_total-跟班学员明细, company_market_year_total-今年上市公司明细, company_market_after_enrollment_total-入学后上市公司明细, course_total-开课场次明细, course_day_total-开课天数明细"), + * @OA\Parameter(name="export_type", in="query", @OA\Schema(type="string"), required=true, description="导出类型:course_signs_invested-被投企业明细, course_signs_total-报名人数明细, course_signs_pass-审核通过人数明细, course_signs_pass_unique-审核通过人数去重明细, courseTypesSum-课程分类明细, areas-区域明细, company_market_total-上市公司明细, ganbu_total-跟班学员明细, company_market_year_total-今年上市公司明细, company_market_after_enrollment_total-入学后上市公司明细, course_total-开课场次明细, course_day_total-开课天数明细, company_join_total-元和员工参与企业明细, company_ganbu_total-全市干部参与企业明细, cover_head_total-苏州头部企业明细, cover_rencai_total-高层次人才明细, cover_stock_total-重点上市公司明细"), * @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,多个英文逗号"), @@ -687,6 +685,156 @@ class OtherController extends CommonController $filename = '开课天数明细'; break; + case 'company_join_total': + // 元和员工参与企业明细 - 使用模型方法 + $companies = CourseSign::companyJoin($start_date, $end_date, $course_ids, true); + foreach ($companies as $company) { + $data[] = [ + 'company_name' => $company->company_name, + 'company_legal_representative' => $company->company_legal_representative ?? '', + 'company_date' => $company->company_date ?? '', + 'company_address' => $company->company_address ?? '', + 'company_city' => $company->company_city ?? '', + 'company_area' => $company->company_area ?? '', + 'business_scope' => $company->business_scope ?? '', + 'contact_phone' => $company->contact_phone ?? '', + 'contact_mail' => $company->contact_mail ?? '', + 'company_tag' => $company->company_tag ?? '', + 'credit_code' => ' ' . $company->credit_code ?? '', + ]; + } + $fields = [ + 'company_name' => '企业名称', + 'company_legal_representative' => '法人', + 'company_date' => '成立时间', + 'company_address' => '地址', + 'company_city' => '所在城市', + 'company_area' => '所在区域', + 'business_scope' => '营业范围', + 'contact_phone' => '联系电话', + 'contact_mail' => '联系邮箱', + 'company_tag' => '企业资质', + 'credit_code' => '统一社会信用代码', + ]; + $filename = '元和员工参与企业明细'; + break; + + case 'company_ganbu_total': + // 全市干部参与企业明细 - 使用模型方法 + $users = CourseSign::ganbu($start_date, $end_date, $course_ids, true); + foreach ($users as $user) { + $data[] = [ + 'user_name' => $user->name ?? '', + 'mobile' => $user->mobile ?? '', + 'company_name' => $user->company->company_name ?? '', + 'company_area' => $user->company->company_area ?? '', + 'company_city' => $user->company->company_city ?? '', + 'company_position' => $user->company_position ?? '', + ]; + } + $fields = [ + 'user_name' => '学员姓名', + 'mobile' => '手机号', + 'company_name' => '企业名称', + 'company_area' => '所在区域', + 'company_city' => '所在城市', + 'company_position' => '职位', + ]; + $filename = '全市干部参与企业明细'; + break; + + case 'cover_head_total': + // 苏州头部企业明细 - 使用模型方法 + $companies = CourseSign::toubuqiye($start_date, $end_date, $course_ids, true); + foreach ($companies as $company) { + $data[] = [ + 'company_name' => $company->company_name, + 'company_legal_representative' => $company->company_legal_representative ?? '', + 'company_date' => $company->company_date ?? '', + 'company_address' => $company->company_address ?? '', + 'company_city' => $company->company_city ?? '', + 'company_area' => $company->company_area ?? '', + 'company_tag' => $company->company_tag ?? '', + 'business_scope' => $company->business_scope ?? '', + 'contact_phone' => $company->contact_phone ?? '', + 'contact_mail' => $company->contact_mail ?? '', + ]; + } + $fields = [ + 'company_name' => '企业名称', + 'company_legal_representative' => '法人', + 'company_date' => '成立时间', + 'company_address' => '地址', + 'company_city' => '所在城市', + 'company_area' => '所在区域', + 'company_tag' => '企业资质', + 'business_scope' => '营业范围', + 'contact_phone' => '联系电话', + 'contact_mail' => '联系邮箱', + ]; + $filename = '苏州头部企业明细'; + break; + + case 'cover_rencai_total': + // 高层次人才明细 - 使用模型方法 + $users = CourseSign::rencai($start_date, $end_date, $course_ids, true); + // 加载关联关系 + $users->load('company'); + foreach ($users as $user) { + $data[] = [ + 'user_name' => $user->name ?? '', + 'mobile' => $user->mobile ?? '', + 'company_name' => $user->company_name ?? '', + 'company_area' => $user->company_area ?? '', + 'company_city' => $user->company->company_city ?? '', + 'company_position' => $user->company_position ?? '', + 'education' => $user->education ?? '', + ]; + } + $fields = [ + 'user_name' => '学员姓名', + 'mobile' => '手机号', + 'company_name' => '企业名称', + 'company_area' => '所在区域', + 'company_city' => '所在城市', + 'company_position' => '职位', + 'education' => '学历', + ]; + $filename = '高层次人才明细'; + break; + + case 'cover_stock_total': + // 重点上市公司明细 - 使用模型方法 + $companies = CourseSign::shangshi($start_date, $end_date, $course_ids, true); + foreach ($companies as $company) { + $data[] = [ + 'company_name' => $company->company_name, + 'company_legal_representative' => $company->company_legal_representative ?? '', + 'company_date' => $company->company_date ?? '', + 'stock_date' => $company->stock_date ?? '', + 'company_address' => $company->company_address ?? '', + 'company_city' => $company->company_city ?? '', + 'company_area' => $company->company_area ?? '', + 'business_scope' => $company->business_scope ?? '', + 'contact_phone' => $company->contact_phone ?? '', + 'contact_mail' => $company->contact_mail ?? '', + ]; + } + $fields = [ + 'company_name' => '企业名称', + 'company_legal_representative' => '法人', + 'company_date' => '成立时间', + 'stock_date' => '上市日期', + 'company_address' => '地址', + 'company_city' => '所在城市', + 'company_area' => '所在区域', + 'business_scope' => '营业范围', + 'contact_phone' => '联系电话', + 'contact_mail' => '联系邮箱', + ]; + $filename = '重点上市公司明细'; + break; + default: return $this->fail([ResponseCode::ERROR_PARAMETER, '不支持的导出类型']); } diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index 0b9a65f..2d2b36e 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -379,7 +379,7 @@ class CourseSign extends SoftDeletesModel $query->whereIn('id', $courseSignsQuery->get()->pluck('user_id')); })->where('company_market', 1)->get(); if ($retList) { - return $list->get(); + return $list; } else { return $list->count(); } From a7315e238cd69e00f87c4f8e01973ed660856cbf Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 15:31:37 +0800 Subject: [PATCH 17/19] update --- app/Http/Controllers/Admin/OtherController.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index cd06e4e..60f0a56 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -250,6 +250,8 @@ class OtherController extends CommonController // 元和员工参与企业 $list['company_join_total'] = CourseSign::companyJoin($start_date, $end_date, $course_ids); + // 全市干部参与企业 + $list['company_ganbu_total'] = CourseSign::ganbu($start_date, $end_date, $course_ids); // 苏州头部企业 $list['cover_head_total'] = CourseSign::toubuqiye($start_date, $end_date, $course_ids); // 高层次人才 From a39f3844896d5bb7ae0fa80b99d64d48a9b73d12 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 15:34:36 +0800 Subject: [PATCH 18/19] update --- app/Models/CourseSign.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index 2d2b36e..98c8318 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -148,7 +148,7 @@ class CourseSign extends SoftDeletesModel */ public static function yhInvested($start_date = null, $end_date = null, $retList = false) { - $courseSignByTypeQuery = self::getStudentList($start_date, $end_date, null, null); + $courseSignByTypeQuery = self::getStudentList($start_date, $end_date, 1, null); $list = Company::whereHas('users', function ($query) use ($courseSignByTypeQuery) { $query->whereIn('id', $courseSignByTypeQuery->get()->pluck('user_id')); })->where('is_yh_invested', 1)->get(); @@ -171,7 +171,7 @@ class CourseSign extends SoftDeletesModel */ public static function genban($start_date, $end_date, $course_ids = null, $retList = false) { - $courseSignsQuery = self::getStudentList($start_date, $end_date, null, $course_ids); + $courseSignsQuery = self::getStudentList($start_date, $end_date, 1, $course_ids); $courseSigns = $courseSignsQuery->whereHas('user', function ($query) { $query->where('from', '跟班学员'); })->get(); From 6c157f2ab9e5b78aa9f57427baff6375909de3df Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Mon, 24 Nov 2025 15:38:19 +0800 Subject: [PATCH 19/19] update --- app/Http/Controllers/Admin/OtherController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 60f0a56..cbaa01e 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -265,7 +265,7 @@ class OtherController extends CommonController $courseTypes = CourseType::whereIn('id', $course_type_id)->get(); foreach ($courseTypes as $courseType) { // 获取课程 - $courses2 = Course::where('type', $courseType->id)->get(); + $courses2 = Course::where('type', $courseType->id)->orderBy('start_date', 'asc')->get(); foreach ($courses2 as $course) { $courseTypesSum[] = [ 'course_type' => $courseType->name,