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.

315 lines
12 KiB

6 months ago
<?php
namespace App\Models;
4 weeks ago
use Illuminate\Support\Facades\Log;
6 months ago
use OwenIt\Auditing\Models\Audit;
class CourseSign extends SoftDeletesModel
{
protected $casts = ['file_ids' => 'json', 'fee_file_ids' => 'json', 'data' => 'json', 'change_data' => 'json'];
protected $appends = ['files', 'fee_files', 'status_text', 'fee_status_text'];
public static $intToString = [
'status' => [
0 => '待审核',
1 => '审核通过',
2 => '审核不通过',
3 => '备选',
4 => '已取消',
5 => '主动放弃',
6 => '黑名单'
],
'fee_status' => [
0 => '未缴费',
1 => '缴费成功',
2 => '缴费失败',
3 => '待确认'
],
];
public function getStatusTextAttribute($value)
{
return self::$intToString['status'][$this->status] ?? '';
}
public function getFeeStatusTextAttribute($value)
{
return self::$intToString['fee_status'][$this->fee_status] ?? '';
}
public function getFilesAttribute($value)
{
3 months ago
if (empty($this->file_ids))
return [];
6 months ago
return Upload::whereIn('id', $this->file_ids)->get();
}
public function getFeeFilesAttribute($value)
{
3 months ago
if (empty($this->fee_file_ids))
return [];
6 months ago
return Upload::whereIn('id', $this->fee_file_ids)->get();
}
public function course()
{
return $this->hasOne(Course::class, 'id', 'course_id');
}
public function user()
{
return $this->hasOne(User::class, 'id', 'user_id');
}
/**
* 第三方日志记录
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function thirdAppointmentLogs()
{
return $this->hasMany(ThirdAppointmentLog::class, 'course_sign_id', 'id');
}
3 months ago
/**
* 指定时间内的报名信息(未去重)
*/
3 weeks ago
public static function courseSignsTotal($start_date, $end_date, $status = null, $course_ids = null, $area = null, $retList = false)
3 months ago
{
2 weeks ago
$total = 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])
->whereBetween('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);
4 weeks ago
}
2 weeks ago
}
})->whereNotIn('status', [4, 5]);
3 weeks ago
if ($retList) {
// 返回列表
return $total->get();
} else {
// 返回统计数据
return $total->count();
}
3 months ago
}
/**
* 指定时间内的报名信息(去重)
*/
3 weeks ago
public static function courseSignsTotalByUnique($start_date, $end_date, $status = null, $course_ids = null, $area = null, $retList = false)
3 months ago
{
2 weeks ago
$courseSignByType = CourseSign::whereHas('course', function ($query) use ($start_date, $end_date) {
// 开始结束日期的筛选。or查询
$query->whereBetween('start_date', [$start_date, $end_date])
->whereBetween('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);
4 weeks ago
}
2 weeks ago
}
})->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();
3 weeks ago
$user = User::whereIn('id', $courseSignByType->pluck('user_id'))->distinct('mobile');
if ($retList) {
// 列表
2 weeks ago
return $user->groupBy('mobile')->get();
3 weeks ago
} else {
// 统计数据
return $user->count();
}
3 months ago
}
3 weeks ago
/**
* 指定时间内的被投企业
*/
3 weeks ago
public static function yhInvested($start_date, $end_date, $retList = false)
3 weeks ago
{
2 weeks ago
$courseSignByType = CourseSign::whereHas('course', function ($query) use ($start_date, $end_date) {
// 开始结束日期的筛选。or查询
$query->whereBetween('start_date', [$start_date, $end_date])
->whereBetween('end_date', [$start_date, $end_date]);
})->whereNotIn('status', [4, 5])->get();
3 weeks ago
$list = Company::whereHas('users', function ($query) use ($courseSignByType) {
3 weeks ago
$query->whereIn('id', $courseSignByType->pluck('user_id'));
3 weeks ago
})->where('is_yh_invested', 1)->get();
if ($retList) {
// 返回列表
return $list;
} else {
// 返回统计数据
return $list->count();
}
3 weeks ago
}
3 weeks ago
/**
* 跟班学员(统计或列表)
* @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, $end_date, $course_ids = null, $retList = false)
{
2 weeks ago
$courseSignsForGanbu = self::whereHas('course', function ($query) use ($start_date, $end_date) {
// 开始结束日期的筛选。or查询
$query->whereBetween('start_date', [$start_date, $end_date])
->whereBetween('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])
3 weeks ago
->whereHas('user', function ($query) {
$query->where('from', '跟班学员');
})->get();
if ($retList) {
3 weeks ago
return User::with('company')->whereIn('id', $courseSignsForGanbu->pluck('user_id'))->get();
3 weeks ago
} else {
return User::whereIn('id', $courseSignsForGanbu->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|array
*/
public static function companyMarketAfterEnrollment($start_date, $end_date, $course_ids = null, $retList = false)
{
2 weeks ago
$courseSignsForStock = self::whereHas('course', function ($query) use ($start_date, $end_date) {
// 开始结束日期的筛选。or查询
$query->whereBetween('start_date', [$start_date, $end_date])
->whereBetween('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])
3 weeks ago
->with('user.company')
->get();
$companiesAfterEnrollment = [];
foreach ($courseSignsForStock as $sign) {
if ($sign->user && $sign->user->company && $sign->user->company->company_market == 1) {
$signDate = \Carbon\Carbon::parse($sign->created_at)->format('Y-m-d');
$stockDate = $sign->user->company->stock_date;
if ($stockDate && $stockDate >= $signDate) {
$companyId = $sign->user->company->id;
if (!isset($companiesAfterEnrollment[$companyId])) {
$companiesAfterEnrollment[$companyId] = [
'company' => $sign->user->company,
'first_sign_date' => $signDate,
'users' => [],
];
}
if ($retList) {
$companiesAfterEnrollment[$companyId]['users'][] = $sign->user;
}
}
}
}
if ($retList) {
return $companiesAfterEnrollment;
} else {
return count($companiesAfterEnrollment);
}
}
2 weeks ago
/**
* 区域统计
* @param string $start_date 开始日期
* @param string $end_date 结束日期
* @param array|null $course_ids 课程ID数组不传则统计所有课程
* @param bool $retList 是否返回列表false返回详情true返回列表
*/
public static function area($start_date, $end_date, $status = null, $course_ids = null, $retList = false)
{
// 获取所有学员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])
->whereBetween('end_date', [$start_date, $end_date]);
})->whereHas('user')->whereNotIn('status', [4, 5]);
// 地区
$suzhouArea = Company::where('company_city', '苏州市')->pluck('company_area')->unique();
$list = [];
foreach ($suzhouArea as $area) {
2 weeks ago
$sourseSignList2 = (clone $courseSignList)->whereHas('user', function ($query) use ($area) {
$query->whereHas('company', function ($query) use ($area) {
$query->where('company_area', $area);
});
})->get();
2 weeks ago
$list[] = [
'area' => $area,
2 weeks ago
// 未去重
'total' => $sourseSignList2->count(),
// 已去重
2 weeks ago
'total_unique' => User::whereIn('id', $sourseSignList2->pluck('user_id'))->distinct('mobile')->groupBy('mobile')->count(),
2 weeks ago
];
}
2 weeks ago
$courseSignList3 = (clone $courseSignList)->whereHas('user', function ($query) {
$query->whereHas('company', function ($query) {
$query->where('company_city', '!=', '苏州市');
});
})->get();
2 weeks ago
$list[] = [
'area' => '苏州市外',
2 weeks ago
'total' => $courseSignList3->count(),
// 已去重
'total_unique' => User::groupBy('mobile')->whereIn('id', $courseSignList3->pluck('user_id'))->count(),
2 weeks ago
];
if ($retList) {
// 返回列表
return $list;
} else {
// 返回统计数据
return $courseSignList->get();
}
}
6 months ago
}