You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
4.2 KiB
143 lines
4.2 KiB
<?php |
|
|
|
namespace App\Admin\Metrics\Examples\Follow; |
|
|
|
use App\Models\AdmissionNewStudents; |
|
use App\Models\SecondaryCollege; |
|
use App\Models\Speciality; |
|
use App\Models\UsersMember; |
|
use Dcat\Admin\Widgets\Metrics\Round; |
|
use Illuminate\Support\Facades\DB; |
|
|
|
|
|
class AllEnrollCollege extends Round |
|
{ |
|
// 保存自定义参数 |
|
protected $data = []; |
|
|
|
// 构造方法参数必须设置默认值 |
|
public function __construct(array $data = []) |
|
{ |
|
$this->data = $data; |
|
|
|
parent::__construct(); |
|
} |
|
|
|
|
|
/** |
|
* 初始化卡片内容 |
|
*/ |
|
protected function init() |
|
{ |
|
parent::init(); |
|
|
|
$this->title('各院总录取统计'); |
|
if (is_string($this->data['secondary_college_id']) && !empty($this->data['secondary_college_id'])) { |
|
$this->subTitle(SecondaryCollege::query()->where('id', $this->data['secondary_college_id'])->value('name')); |
|
} else { |
|
$this->subTitle("当前学院:全校"); |
|
} |
|
|
|
// 新生数据 |
|
$studentsIds = AdmissionNewStudents::query()->where(["is_new_student" => "1"])->pluck('idCard')->toArray(); |
|
$all = UsersMember::query() |
|
->whereIn("idcard", $studentsIds) |
|
->where("enroll_status", 1) |
|
->where(function ($query) { |
|
if (is_array($this->data['secondary_college_id'])) { |
|
$ids = $this->data['secondary_college_id']; |
|
} else { |
|
$ids = explode(',', $this->data['secondary_college_id']); |
|
} |
|
|
|
$specialityIds = Speciality::query()->whereIn("secondary_college_id", array_filter($ids))->pluck('id')->toArray(); |
|
$query->whereIn('speciality_id', $specialityIds); |
|
}) |
|
->select('sex', DB::raw('count(*) as total')) |
|
->groupBy('sex') |
|
->pluck('total', 'sex') |
|
->toArray(); |
|
|
|
// 总人数 |
|
$total = array_sum($all); |
|
// 男生 |
|
$man = $all[1] ?? 0; |
|
// 女生 |
|
$girl = $all[2] ?? 0; |
|
|
|
$manPercent = $total != 0 ? number_format(($man / $total) * 100) : 0; |
|
$girlPercent = $total != 0 ? number_format(($girl / $total) * 100) : 0; |
|
// 卡片内容 |
|
$this->withContent($total, $man, $girl)->height('220px'); |
|
$this->chartLabels(['男生', '女生']); |
|
// 图表数据 |
|
$this->withChart([$manPercent, $girlPercent]); |
|
// 总数 |
|
$this->chartTotal('总人数', $total); |
|
} |
|
|
|
|
|
/** |
|
* 设置图表数据. |
|
* |
|
* @param array $data |
|
* |
|
* @return $this |
|
*/ |
|
public function withChart(array $data) |
|
{ |
|
return $this->chart([ |
|
'series' => $data, |
|
]); |
|
} |
|
|
|
|
|
/** |
|
* 卡片内容. |
|
* |
|
* @param int $finished |
|
* @param int $pending |
|
* @param int $rejected |
|
* |
|
* @return $this |
|
*/ |
|
public function withContent($finished, $pending, $rejected) |
|
{ |
|
return $this->content( |
|
<<<HTML |
|
<div class="col-12 d-flex flex-column flex-wrap text-center" style="max-width: 220px"> |
|
<div class="chart-info d-flex justify-content-between mb-1 mt-2" > |
|
<div class="series-info d-flex align-items-center"> |
|
<i class="fa fa-circle-o text-bold-700 text-primary"></i> |
|
<span class="text-bold-600 ml-50">总人数</span> |
|
</div> |
|
<div class="product-result"> |
|
<span>{$finished}</span> |
|
</div> |
|
</div> |
|
|
|
<div class="chart-info d-flex justify-content-between mb-1"> |
|
<div class="series-info d-flex align-items-center"> |
|
<i class="fa fa-circle-o text-bold-700 text-warning"></i> |
|
<span class="text-bold-600 ml-50">男生</span> |
|
</div> |
|
<div class="product-result"> |
|
<span>{$pending}</span> |
|
</div> |
|
</div> |
|
|
|
<div class="chart-info d-flex justify-content-between mb-1"> |
|
<div class="series-info d-flex align-items-center"> |
|
<i class="fa fa-circle-o text-bold-700 text-danger"></i> |
|
<span class="text-bold-600 ml-50">女生</span> |
|
</div> |
|
<div class="product-result"> |
|
<span>{$rejected}</span> |
|
</div> |
|
</div> |
|
</div> |
|
HTML |
|
); |
|
} |
|
} |
|
|
|
|