'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) { if (empty($this->file_ids)) return []; return Upload::whereIn('id', $this->file_ids)->get(); } public function getFeeFilesAttribute($value) { if (empty($this->fee_file_ids)) return []; 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'); } /** * 获取学员列表数据 */ public static function getStudentList($start_date = null, $end_date = null, $status = null, $course_ids = null) { $baseQuery = CourseSign::where(function ($query) use ($course_ids, $status) { if ($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查询 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 $totalQuery->get(); } else { // 基础数据 $baseTotal = $totalQuery->count(); // 历史数据 $historyTotal = HistoryCourse::where(function ($query) use ($start_date, $end_date) { // 开始结束日期的筛选。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'); // 返回统计数据 return $historyTotal + $baseTotal; } } /** * 指定时间内的报名信息(去重) */ public static function courseSignsTotalByUnique($start_date, $end_date, $status = null, $course_ids = null, $retList = false) { $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; } else { $baseTotal = $user->count(); // 历史数据 $historyTotal = HistoryCourse::where(function ($query) use ($start_date, $end_date) { // 开始结束日期的筛选。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'); // 统计数据 return $baseTotal + $historyTotal; } } /** * 指定时间内的被投企业 */ public static function yhInvested($start_date = null, $end_date = null, $retList = false) { $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(); 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 genban($start_date, $end_date, $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|array */ public static function companyMarketAfterEnrollment($start_date, $end_date, $course_ids = null, $retList = false) { $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) { $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); } } /** * 入学后被投企业数量(在指定时间范围内报名的学员所在公司中,在入学后被投的公司数量) * @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 companyInvestedAfterEnrollment($start_date, $end_date, $course_ids = null, $retList = false) { $courseSignsQuery = self::getStudentList($start_date, $end_date, 1, $course_ids); $courseSignsForInvest = $courseSignsQuery->with('user.company')->get(); $companiesAfterEnrollment = []; foreach ($courseSignsForInvest as $sign) { if ($sign->user && $sign->user->company && $sign->user->company->is_yh_invested == 1) { $signDate = \Carbon\Carbon::parse($sign->created_at)->format('Y-m-d'); // 从 project_users 中获取最早的被投时间 $projectUsers = $sign->user->company->project_users; $investDate = null; if (!empty($projectUsers) && is_array($projectUsers)) { foreach ($projectUsers as $projectUser) { if (!empty($projectUser['investDate'])) { if ($investDate === null || $projectUser['investDate'] < $investDate) { $investDate = $projectUser['investDate']; } } } } // 被投时间 >= 报名时间,说明是入学后被投 if ($investDate && $investDate >= $signDate) { $companyId = $sign->user->company->id; if (!isset($companiesAfterEnrollment[$companyId])) { $companiesAfterEnrollment[$companyId] = [ 'company' => $sign->user->company, 'first_sign_date' => $signDate, 'invest_date' => $investDate, 'users' => [], ]; } if ($retList) { $companiesAfterEnrollment[$companyId]['users'][] = $sign->user; } } } } if ($retList) { return $companiesAfterEnrollment; } else { return count($companiesAfterEnrollment); } } /** * 区域统计 * @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) { $courseSignList = self::getStudentList($start_date, $end_date, $status, $course_ids); // 地区 $suzhouArea = Company::where('company_city', '苏州市')->pluck('company_area')->unique(); $list = []; foreach ($suzhouArea as $area) { $sourseSignList2 = (clone $courseSignList)->whereHas('user', function ($query) use ($area) { $query->whereHas('company', function ($query) use ($area) { $query->where('company_area', $area); }); })->get(); $list[] = [ 'area' => $area, // 未去重 'total' => $sourseSignList2->count(), // 已去重 'total_unique' => User::whereIn('id', $sourseSignList2->pluck('user_id'))->groupBy('mobile')->get()->count(), ]; } $courseSignList3 = (clone $courseSignList)->whereHas('user', function ($query) { $query->whereHas('company', function ($query) { $query->where('company_city', '!=', '苏州市'); }); })->get(); $list[] = [ 'area' => '苏州市外', 'total' => $courseSignList3->count(), // 已去重 'total_unique' => User::groupBy('mobile')->whereIn('id', $courseSignList3->pluck('user_id'))->get()->count(), ]; if ($retList) { // 返回列表 return $list; } else { // 返回统计数据 return $courseSignList->get(); } } /** * 元和员工参人员 */ public static function companyJoin($start_date = null, $end_date = null, $course_ids = null, $retList = false) { $courseSignsQuery = self::getStudentList($start_date, $end_date, null, $course_ids); $courseSignByType = $courseSignsQuery->get(); // 检测关键词 $companyNameKeyword = [ '元禾控股', '元禾原点', '元禾厚望', '元禾重元', '元禾璞华', '元禾谷风', '元禾绿柳', '元禾辰坤', '元禾沙湖', '禾裕集团', '苏州科服', '信诚管理咨询', '集成电路公司', '常州团队', '国企元禾' ]; $company = Company::where(function ($query) use ($companyNameKeyword) { foreach ($companyNameKeyword as $item) { $query->orWhere('company_name', 'like', '%' . $item . '%'); } })->get(); $list = User::whereIn('id', $courseSignByType->pluck('user_id')) ->whereIn('company_id', $company->pluck('id')) ->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) { $query->whereHas('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; } else { return $list->count(); } } }