diff --git a/app/Models/CourseSign.php b/app/Models/CourseSign.php index 01889a6..fbbcfab 100755 --- a/app/Models/CourseSign.php +++ b/app/Models/CourseSign.php @@ -695,16 +695,62 @@ class CourseSign extends SoftDeletesModel 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::approvedStudents()->whereHas('users', function ($query) use ($courseSignByType) { - $query->whereIn('id', $courseSignByType->pluck('user_id')); - })->where('company_tag', 'like', '%' . '高新技术企业' . '%')->get(); + $courseSigns = $courseSignsQuery->with(['user.company'])->get(); + + // 获取所有高新技术企业的公司ID + $companyIds = $courseSigns->pluck('user.company.id') + ->filter() + ->unique() + ->toArray(); + + // 获取这些公司中标记为高新技术企业的公司 + $companies = Company::approvedStudents()->whereIn('id', $companyIds) + ->where('company_tag', 'like', '%' . '高新技术企业' . '%') + ->get() + ->keyBy('id'); + + // 筛选苏州地区的公司 + $suzhouCompanyIds = []; + foreach ($courseSigns as $courseSign) { + if (!$courseSign->user || !$courseSign->user->company) { + continue; + } + + $companyId = $courseSign->user->company->id; + // 只处理高新技术企业的记录 + if (!isset($companies[$companyId])) { + continue; + } + + $user = $courseSign->user; + $company = $user->company; + + // 判断是否为苏州地区:user表的company_address包含"苏州",或关联公司的company_address包含"苏州",或company_city包含"苏州" + $isSuzhou = false; + if ($user->company_address && strpos($user->company_address, '苏州') !== false) { + $isSuzhou = true; + } elseif ($company->company_address && strpos($company->company_address, '苏州') !== false) { + $isSuzhou = true; + } elseif ($company->company_city && strpos($company->company_city, '苏州') !== false) { + $isSuzhou = true; + } + + if ($isSuzhou) { + $suzhouCompanyIds[$companyId] = true; + } + } + + // 只保留苏州地区的高新技术企业 + $suzhouCompanies = $companies->filter(function ($company) use ($suzhouCompanyIds) { + return isset($suzhouCompanyIds[$company->id]); + }); + if ($retList) { // 返回列表 - return $list; + return $suzhouCompanies->values(); } else { // 返回统计数据 - return $list->count(); + return count($suzhouCompanyIds); } } @@ -720,10 +766,10 @@ class CourseSign extends SoftDeletesModel $query->whereHas('typeDetail', function ($q) { $q->where('name', '人才培训'); }); - })->get(); + })->with(['user.company'])->get(); // 条件2:data 字段中 name="个人荣誉" 且 value != "其他" 的用户 - $courseSigns2 = $courseSignsQuery->get()->filter(function ($courseSign) { + $courseSigns2 = $courseSignsQuery->with(['user.company'])->get()->filter(function ($courseSign) { if (empty($courseSign->data) || !is_array($courseSign->data)) { return false; } @@ -743,10 +789,46 @@ class CourseSign extends SoftDeletesModel ->unique() ->filter(); + // 筛选苏州地区的用户 + $suzhouUserIds = []; + $allCourseSigns = $courseSigns1->merge($courseSigns2); + + foreach ($allCourseSigns as $courseSign) { + if (!$courseSign->user) { + continue; + } + + $userId = $courseSign->user->id; + // 只处理符合条件的用户 + if (!in_array($userId, $allUserIds->toArray())) { + continue; + } + + $user = $courseSign->user; + $company = $user->company; + + // 判断是否为苏州地区:user表的company_address包含"苏州",或关联公司的company_address包含"苏州",或company_city包含"苏州" + $isSuzhou = false; + if ($user->company_address && strpos($user->company_address, '苏州') !== false) { + $isSuzhou = true; + } elseif ($company && $company->company_address && strpos($company->company_address, '苏州') !== false) { + $isSuzhou = true; + } elseif ($company && $company->company_city && strpos($company->company_city, '苏州') !== false) { + $isSuzhou = true; + } + + if ($isSuzhou) { + $suzhouUserIds[$userId] = true; + } + } + + // 只保留苏州地区的用户ID + $suzhouUserIds = array_keys($suzhouUserIds); + if ($retList) { - return User::whereIn('id', $allUserIds)->get(); + return User::whereIn('id', $suzhouUserIds)->get(); } else { - return $allUserIds->count(); + return count($suzhouUserIds); } } diff --git a/统计指标说明.json b/统计指标说明.json index 6a1b165..cc3dc4b 100644 --- a/统计指标说明.json +++ b/统计指标说明.json @@ -27,22 +27,22 @@ "company_market_total": { "name": "重点上市公司数", "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户总数;2、如果一个用户报名多个课程只算一个有效用户;3、筛选出关联的公司是上市公司的用户数量。", - "verify": "" + "verify": "企业资质中包含了上市代码的就识别成上市公司" }, "ganbu_total": { "name": "跟班学员数", "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户总数;2、如果一个用户报名多个课程只算一个有效用户;3、筛选出有\"跟班学员\"标签的用户总数。", - "verify": "" + "verify": "学员中心,学员标签筛选对比" }, "company_market_year_total": { "name": "今年上市公司数量", "from": "1、从自定义的上市公司数据里;2、统计上市年份在今年的公司数量。", - "verify": "" + "verify": "自定义上市公司数据对比" }, "company_market_after_enrollment_total": { "name": "入学后上市公司数量", "from": "1、直接从上市公司表中查询;2、统计所有标记为\"入学后上市\"的公司数量;3、注意:这个统计不依赖学员报名记录,统计的是自定义的上市的公司。", - "verify": "" + "verify": "自定义上市公司数据对比" }, "course_signs_invested": { "name": "累计被投企业数", @@ -62,7 +62,7 @@ "company_join_total": { "name": "元和员工参与人数", "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下报名记录的用户总数(如果一个用户报名多个课程只算一个有效用户);2、筛选自己填写的公司名称包含以下关键词的用户总数:元禾控股、元禾原点、元禾厚望、元禾重元、元禾璞华、元禾谷风、元禾绿柳、元禾辰坤、元禾沙湖、禾裕集团、苏州科服、信诚管理咨询、集成电路公司、常州团队、国器元禾;3、加上自定义的元禾员工/干部培训数据里满足时间范围内的元禾员工总和;4、将两部分数据相加得到总数。", - "verify": "" + "verify": "公司管理,筛选公司名字加起来对比" }, "company_ganbu_total": { "name": "全市干部参与企业", @@ -71,17 +71,17 @@ }, "cover_head_total": { "name": "苏州头部企业", - "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户;2、筛选关联的公司包含\"高新技术企业\"字符串的公司;3、统计公司数量。", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户;2、筛选关联的公司包含\"高新技术企业\"字符串的公司,并且用户填写的公司地址,或者关联的企查查公司地址包含苏州的公司;3、统计公司数量。", "verify": "" }, "cover_rencai_total": { - "name": "高层次人才", - "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户;2、筛选满足以下条件之一的用户:参加过\"人才培训\"课程类型的用户,或填写的所有报名表单里个人荣誉字段不包含\"其他\"的用户(剩下的选项是国家人才、市级人才等);3、取两者的并集得到用户总数。", + "name": "苏州高层次人才", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户;2、筛选满足以下条件之一的用户:参加过\"人才培训\"课程类型的用户,或填写的所有报名表单里个人荣誉字段不包含\"其他\"的用户(剩下的选项是国家人才、市级人才等)。并且用户填写的公司地址,或者关联的企查查公司地址包含苏州的公司;3、取两者的并集得到用户总数。", "verify": "" }, "cover_stock_total": { - "name": "重点上市公司", - "from": "1、统计在指定时间范围内、指定课程范围内报名的学员;2、通过学员关联到其所在公司;3、筛选出重点上市公司;4、按公司去重统计公司数量;5、注意:与\"上市公司数\"的统计逻辑相同,但筛选的是重点上市公司,同一公司多个学员只计算一次。", + "name": "苏州重点上市公司", + "from": "1、统计在指定时间范围内、指定课程范围内报名的学员;2、通过学员关联到其所在公司;3、筛选出上市公司;4、并且用户填写的公司地址,或者关联的企查查公司地址包含苏州的公司", "verify": "" } } \ No newline at end of file