master
cody 3 months ago
parent 91e783b1a1
commit 40d38d4ab4

@ -0,0 +1,145 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Helpers\ResponseCode;
use App\Models\CourseTypeDataOverviewConfig;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
class CourseTypeDataOverviewConfigController extends BaseController
{
/**
* 构造函数
*/
public function __construct()
{
parent::__construct(new CourseTypeDataOverviewConfig());
}
/**
* @OA\Get(
* path="/api/admin/course-type-data-overview-config/index",
* tags={"课程体系数据总览配置"},
* summary="列表",
* description="",
* @OA\Parameter(name="is_export", in="query", @OA\Schema(type="string"), required=false, description="是否导出0否1是"),
* @OA\Parameter(name="export_fields", in="query", @OA\Schema(type="string"), required=false, description="需要导出的字段数组"),
* @OA\Parameter(name="filter", in="query", @OA\Schema(type="string"), required=false, description="查询条件。数组"),
* @OA\Parameter(name="show_relation", in="query", @OA\Schema(type="string"), required=false, description="需要输出的关联关系数组"),
* @OA\Parameter(name="page_size", in="query", @OA\Schema(type="string"), required=false, description="每页显示的条数"),
* @OA\Parameter(name="page", in="query", @OA\Schema(type="string"), required=false, description="页码"),
* @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\Response(
* response="200",
* description="暂无"
* )
* )
*/
public function index()
{
return parent::index();
}
/**
* @OA\Get(
* path="/api/admin/course-type-data-overview-config/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/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();
}
}

@ -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'));
}
/**

@ -0,0 +1,9 @@
<?php
namespace App\Models;
class CourseTypeDataOverviewConfig extends SoftDeletesModel
{
protected $table = 'course_type_data_overview_configs';
}

@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('course_type_data_overview_configs', function (Blueprint $table) {
$table->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');
}
};

@ -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"]);

Loading…
Cancel
Save