|
|
|
|
@ -188,33 +188,6 @@ class CourseSign extends SoftDeletesModel
|
|
|
|
|
$companies = Company::approvedStudents()->whereHas('users', function ($query) use ($userIds) {
|
|
|
|
|
$query->whereIn('id', $userIds);
|
|
|
|
|
})->where('is_yh_invested', 1)->get();
|
|
|
|
|
// 自定义时间:需要按被投时间筛选
|
|
|
|
|
// 筛选出被投时间在范围内的企业
|
|
|
|
|
$filteredCompanies = [];
|
|
|
|
|
foreach ($companies as $company) {
|
|
|
|
|
$projectUsers = $company->project_users ?? [];
|
|
|
|
|
$hasValidInvestDate = false;
|
|
|
|
|
$allInvestDatesNull = true;
|
|
|
|
|
|
|
|
|
|
foreach ($projectUsers as $item) {
|
|
|
|
|
$investDate = $item['investDate'] ?? null;
|
|
|
|
|
// 检查是否有有效的被投时间
|
|
|
|
|
if ($investDate) {
|
|
|
|
|
$allInvestDatesNull = false;
|
|
|
|
|
// 检查被投时间是否在范围内
|
|
|
|
|
if ($investDate <= $end_date) {
|
|
|
|
|
$hasValidInvestDate = true;
|
|
|
|
|
break; // 只要有一条满足就加入
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果有有效的被投时间在范围内,或者所有被投时间都是null,则加入结果
|
|
|
|
|
if ($hasValidInvestDate || $allInvestDatesNull) {
|
|
|
|
|
$filteredCompanies[] = $company;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$companies = collect($filteredCompanies);
|
|
|
|
|
|
|
|
|
|
// 返回结果
|
|
|
|
|
if ($retList) {
|
|
|
|
|
@ -482,63 +455,84 @@ class CourseSign extends SoftDeletesModel
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 入学后被投企业数量(在指定时间范围内报名的学员所在公司中,在入学后被投的公司数量)
|
|
|
|
|
* 当前入学后被投企业数量(被投时间在指定时间范围内,且学员入学时间小于等于被投时间的公司数量)
|
|
|
|
|
* @param string $start_date 开始日期
|
|
|
|
|
* @param string $end_date 结束日期
|
|
|
|
|
* @param array|null $course_ids 课程ID数组,不传则统计所有课程
|
|
|
|
|
* @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', 'course'])->get();
|
|
|
|
|
// 获取所有被投企业
|
|
|
|
|
$companies = Company::approvedStudents()->where('is_yh_invested', 1)->get();
|
|
|
|
|
$companiesAfterEnrollment = [];
|
|
|
|
|
foreach ($courseSignsForInvest as $sign) {
|
|
|
|
|
if ($sign->user && $sign->user->company && $sign->user->company->is_yh_invested == 1) {
|
|
|
|
|
// 入学时间:使用参与课程的课程开始时间(course->start_date),不使用报名时间(created_at)
|
|
|
|
|
$enrollmentDate = null;
|
|
|
|
|
if ($sign->course && $sign->course->start_date) {
|
|
|
|
|
$enrollmentDate = \Carbon\Carbon::parse($sign->course->start_date)->format('Y-m-d');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果没有课程开始时间,跳过这条记录
|
|
|
|
|
if (!$enrollmentDate) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
foreach ($companies as $company) {
|
|
|
|
|
$projectUsers = $company->project_users ?? [];
|
|
|
|
|
|
|
|
|
|
// 从 project_users 中检查是否有任何一个被投时间 >= 课程开始时间(入学时间)
|
|
|
|
|
$projectUsers = $sign->user->company->project_users;
|
|
|
|
|
$hasInvestAfterEnrollment = false;
|
|
|
|
|
$investDate = null;
|
|
|
|
|
if (!empty($projectUsers) && is_array($projectUsers)) {
|
|
|
|
|
foreach ($projectUsers as $projectUser) {
|
|
|
|
|
if (!empty($projectUser['investDate'])) {
|
|
|
|
|
$currentInvestDate = $projectUser['investDate'];
|
|
|
|
|
// 只要有一个被投时间 >= 课程开始时间(入学时间),就满足条件
|
|
|
|
|
if ($currentInvestDate >= $enrollmentDate) {
|
|
|
|
|
$hasInvestAfterEnrollment = true;
|
|
|
|
|
// 记录满足条件的被投时间(如果有多个,记录最早的)
|
|
|
|
|
if ($investDate === null || $currentInvestDate < $investDate) {
|
|
|
|
|
$investDate = $currentInvestDate;
|
|
|
|
|
// 遍历被投时间,找到在指定时间范围内的被投时间
|
|
|
|
|
foreach ($projectUsers as $projectUser) {
|
|
|
|
|
$investDate = $projectUser['investDate'] ?? null;
|
|
|
|
|
|
|
|
|
|
// 检查被投时间是否在指定时间范围内
|
|
|
|
|
if ($investDate && $investDate >= $start_date && $investDate <= $end_date) {
|
|
|
|
|
// 获取该公司的所有学员
|
|
|
|
|
$users = $company->users()->get();
|
|
|
|
|
|
|
|
|
|
// 检查是否有学员的入学时间(课程开始时间)小于等于被投时间
|
|
|
|
|
$hasValidEnrollment = false;
|
|
|
|
|
$firstEnrollmentDate = null;
|
|
|
|
|
$matchedUsers = [];
|
|
|
|
|
|
|
|
|
|
foreach ($users as $user) {
|
|
|
|
|
// 获取该学员的所有审核通过的课程报名记录
|
|
|
|
|
$courseSigns = self::where('user_id', $user->id)
|
|
|
|
|
->where('status', 1)
|
|
|
|
|
->with('course')
|
|
|
|
|
->get();
|
|
|
|
|
|
|
|
|
|
foreach ($courseSigns as $courseSign) {
|
|
|
|
|
if ($courseSign->course && $courseSign->course->start_date) {
|
|
|
|
|
$enrollmentDate = \Carbon\Carbon::parse($courseSign->course->start_date)->format('Y-m-d');
|
|
|
|
|
|
|
|
|
|
// 检查入学时间是否小于等于被投时间
|
|
|
|
|
if ($enrollmentDate <= $investDate) {
|
|
|
|
|
$hasValidEnrollment = true;
|
|
|
|
|
// 记录最早的入学时间
|
|
|
|
|
if ($firstEnrollmentDate === null || $enrollmentDate < $firstEnrollmentDate) {
|
|
|
|
|
$firstEnrollmentDate = $enrollmentDate;
|
|
|
|
|
}
|
|
|
|
|
if ($retList) {
|
|
|
|
|
$matchedUsers[] = $user;
|
|
|
|
|
}
|
|
|
|
|
break; // 只要有一个课程满足条件即可
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// 只要有一个被投时间 >= 课程开始时间(入学时间),说明是入学后被投
|
|
|
|
|
if ($hasInvestAfterEnrollment && $investDate) {
|
|
|
|
|
$companyId = $sign->user->company->id;
|
|
|
|
|
if (!isset($companiesAfterEnrollment[$companyId])) {
|
|
|
|
|
$companiesAfterEnrollment[$companyId] = [
|
|
|
|
|
'company' => $sign->user->company,
|
|
|
|
|
'first_enrollment_date' => $enrollmentDate, // 首次入学时间(课程开始时间)
|
|
|
|
|
'invest_date' => $investDate,
|
|
|
|
|
'users' => [],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
if ($retList) {
|
|
|
|
|
$companiesAfterEnrollment[$companyId]['users'][] = $sign->user;
|
|
|
|
|
|
|
|
|
|
// 如果有学员的入学时间小于等于被投时间,则计入统计
|
|
|
|
|
if ($hasValidEnrollment) {
|
|
|
|
|
$companyId = $company->id;
|
|
|
|
|
if (!isset($companiesAfterEnrollment[$companyId])) {
|
|
|
|
|
$companiesAfterEnrollment[$companyId] = [
|
|
|
|
|
'company' => $company,
|
|
|
|
|
'first_enrollment_date' => $firstEnrollmentDate,
|
|
|
|
|
'invest_date' => $investDate,
|
|
|
|
|
'users' => [],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
if ($retList) {
|
|
|
|
|
// 合并用户列表(去重)
|
|
|
|
|
$existingUserIds = array_column($companiesAfterEnrollment[$companyId]['users'], 'id');
|
|
|
|
|
foreach ($matchedUsers as $user) {
|
|
|
|
|
if (!in_array($user->id, $existingUserIds)) {
|
|
|
|
|
$companiesAfterEnrollment[$companyId]['users'][] = $user;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
break; // 只要有一个被投时间满足条件即可
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -630,18 +624,22 @@ class CourseSign extends SoftDeletesModel
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 如果 config 中没有数据,使用空数组(避免 SQL 错误)
|
|
|
|
|
// 如果 config 中没有数据,直接返回空
|
|
|
|
|
if (empty($companyNameKeyword)) {
|
|
|
|
|
$list = collect([]);
|
|
|
|
|
} else {
|
|
|
|
|
$list = User::whereIn('id', $courseSignByType->pluck('user_id'))
|
|
|
|
|
->where(function ($query) use ($companyNameKeyword) {
|
|
|
|
|
foreach ($companyNameKeyword as $item) {
|
|
|
|
|
$query->orWhere('company_name', 'like', '%' . $item . '%');
|
|
|
|
|
}
|
|
|
|
|
})->get();
|
|
|
|
|
if ($retList) {
|
|
|
|
|
return collect([]);
|
|
|
|
|
} else {
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$list = User::whereIn('id', $courseSignByType->pluck('user_id'))
|
|
|
|
|
->where(function ($query) use ($companyNameKeyword) {
|
|
|
|
|
foreach ($companyNameKeyword as $item) {
|
|
|
|
|
$query->orWhere('company_name', 'like', '%' . $item . '%');
|
|
|
|
|
}
|
|
|
|
|
})->get();
|
|
|
|
|
|
|
|
|
|
if ($retList) {
|
|
|
|
|
// 返回列表
|
|
|
|
|
return $list;
|
|
|
|
|
@ -708,10 +706,7 @@ class CourseSign extends SoftDeletesModel
|
|
|
|
|
*/
|
|
|
|
|
public static function isSuzhou($user = null, $company = null)
|
|
|
|
|
{
|
|
|
|
|
// 判断是否为苏州地区:user表的company_address包含"苏州",或关联公司的company_address包含"苏州",或company_city包含"苏州"
|
|
|
|
|
if ($user && $user->company_address && strpos($user->company_address, '苏州') !== false) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
// 判断是否为苏州地区:关联公司的company_address包含"苏州",或company_city包含"苏州"
|
|
|
|
|
if ($company && $company->company_address && strpos($company->company_address, '苏州') !== false) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|