diff --git a/app/Http/Controllers/Admin/CourseTypeDataOverviewConfigController.php b/app/Http/Controllers/Admin/CourseTypeDataOverviewConfigController.php new file mode 100644 index 0000000..6f08cd8 --- /dev/null +++ b/app/Http/Controllers/Admin/CourseTypeDataOverviewConfigController.php @@ -0,0 +1,145 @@ +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/course-type-data-overview-config/save", + * tags={"课程体系数据总览配置"}, + * summary="保存", + * description="", + * @OA\Parameter(name="id", in="query", @OA\Schema(type="int"), required=false, description="Id(存在更新,不存在新增)"), + * @OA\Parameter(name="name", in="query", @OA\Schema(type="string"), required=false, description="显示名称"), + * @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="结束日期(null表示至今)"), + * @OA\Parameter(name="sort", in="query", @OA\Schema(type="integer"), required=false, description="排序"), + * @OA\Parameter(name="status", in="query", @OA\Schema(type="boolean"), required=false, description="状态 0否1是"), + * @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(); + // 记录日志 + $this->saveLogs($original, $model); + return $this->success($model); + } catch (\Exception $exception) { + DB::rollBack(); + return $this->fail([$exception->getCode(), $exception->getMessage()]); + } + } + + /** + * @OA\Get( + * path="/api/admin/course-type-data-overview-config/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/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index 95bd183..8201d76 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -13,6 +13,7 @@ use App\Models\CarparkLog; use App\Models\Company; use App\Models\CourseSign; use App\Models\CourseType; +use App\Models\CourseTypeDataOverviewConfig; use App\Models\CustomFormField; use App\Models\Department; use App\Models\HistoryCourse; @@ -160,35 +161,56 @@ class OtherController extends CommonController $monthCourses = Calendar::with('course.teacher') ->where('start_time', 'like', '%' . date('Y-m') . '%') ->get(); - // 课程统计 - $courseTypes = CourseType::where('is_chart', 1) + + // 1. 从配置表读取配置列表 + $yearConfigs = CourseTypeDataOverviewConfig::where('status', true) ->orderBy('sort', 'asc') - ->where('is_history', 0)->get(); + ->get(); + // 2. 查询对应的 CourseType + $allCourseTypes = CourseType::where('is_chart', 1) + ->orderBy('sort', 'asc') + ->where('is_history', 0) + ->get(); - foreach ($courseTypes as $courseType) { - // 历史已开设期数 - $historyCourse = HistoryCourse::whereHas('typeDetail', function ($query) use ($courseType) { - $query->where('name', 'like', '%' . $courseType->name . '%'); - })->get(); - // 课程 - $courses = Course::where('type', $courseType->id)->where('is_chart', 1)->get(); - // 历史课程期数 - $courseType->history_course_periods_total = $historyCourse->count(); - // 现在课程数据 - $courseType->now_course_periods_total = Course::where('type', $courseType->id)->where('is_chart', 1)->count(); - - // 历史课程培养人数去重 - $courseType->history_course_signs_total = $historyCourse->sum('course_type_signs_pass_unique'); - // 现在课程培养人数 - $courseType->now_course_signs_total = CourseSign::courseSignsTotalByUnique($start_date, $end_date, 1, $courses->pluck('id'), false, false); - - // 已开设期数 - $courseType->course_periods_total = $courseType->now_course_periods_total + $courseType->history_course_periods_total; - // 培养人数去重 - $courseType->course_signs_total = $courseType->history_course_signs_total + $courseType->now_course_signs_total; - } + // 3. 循环所有配置,对每个配置进行统计 + foreach ($yearConfigs as $config) { + // 根据配置获取日期范围 + $configStartDate = $config->start_date; + $configEndDate = $config->end_date ? $config->end_date : date('Y-m-d'); + + // 复制 CourseType 集合(避免引用问题) + $courseTypes = $allCourseTypes->map(function ($item) { + return clone $item; + }); + + // 对每个 CourseType 进行统计 + foreach ($courseTypes as $courseType) { + // 历史已开设期数 + $historyCourse = HistoryCourse::whereHas('typeDetail', function ($query) use ($courseType) { + $query->where('name', 'like', '%' . $courseType->name . '%'); + })->get(); + // 课程 + $courses = Course::where('type', $courseType->id)->where('is_chart', 1)->get(); + // 历史课程期数 + $courseType->history_course_periods_total = $historyCourse->count(); + // 现在课程数据 + $courseType->now_course_periods_total = Course::where('type', $courseType->id)->where('is_chart', 1)->count(); + + // 历史课程培养人数去重 + $courseType->history_course_signs_total = $historyCourse->sum('course_type_signs_pass_unique'); + // 现在课程培养人数(使用配置的日期范围) + $courseType->now_course_signs_total = CourseSign::courseSignsTotalByUnique($configStartDate, $configEndDate, 1, $courses->pluck('id'), false, false); + + // 已开设期数 + $courseType->course_periods_total = $courseType->now_course_periods_total + $courseType->history_course_periods_total; + // 培养人数去重 + $courseType->course_signs_total = $courseType->history_course_signs_total + $courseType->now_course_signs_total; + } + // 将统计数据直接组合到配置对象中 + $config->courseTypes = $courseTypes; + } // 苏州区域数据 $suzhouArea = Company::approvedStudents()->where('company_city', '苏州市')->groupBy('company_area') @@ -228,7 +250,7 @@ class OtherController extends CommonController $article['xiaoyou'] = Article::where('type', 1)->limit(7)->orderBy('sort', 'desc')->get(); $article['yejie'] = Article::where('type', 2)->limit(7)->orderBy('sort', 'desc')->get(); $article['supply_demands'] = SupplyDemand::limit(7)->orderBy('created_at', 'desc')->get(); - return $this->success(compact('list', 'courseTypes', 'suzhou', 'country', 'monthCourses', 'time_axis', 'article')); + return $this->success(compact('list', 'suzhou', 'country', 'monthCourses', 'time_axis', 'article', 'yearConfigs')); } /** diff --git a/app/Models/CourseTypeDataOverviewConfig.php b/app/Models/CourseTypeDataOverviewConfig.php new file mode 100644 index 0000000..1e8102e --- /dev/null +++ b/app/Models/CourseTypeDataOverviewConfig.php @@ -0,0 +1,9 @@ +id(); + $table->string('name')->comment('显示名称'); + $table->date('start_date')->comment('开始日期'); + $table->date('end_date')->nullable()->comment('结束日期(null表示至今)'); + $table->integer('sort')->default(0)->comment('排序'); + $table->boolean('status')->default(true)->comment('状态 0否1是'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('course_type_data_overview_configs'); + } +}; + diff --git a/routes/api.php b/routes/api.php index 7abb577..8a9f35b 100755 --- a/routes/api.php +++ b/routes/api.php @@ -268,6 +268,12 @@ 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('course-type-data-overview-config/index', [\App\Http\Controllers\Admin\CourseTypeDataOverviewConfigController::class, "index"]); + Route::get('course-type-data-overview-config/show', [\App\Http\Controllers\Admin\CourseTypeDataOverviewConfigController::class, "show"]); + Route::post('course-type-data-overview-config/save', [\App\Http\Controllers\Admin\CourseTypeDataOverviewConfigController::class, "save"]); + Route::get('course-type-data-overview-config/destroy', [\App\Http\Controllers\Admin\CourseTypeDataOverviewConfigController::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"]);