From 6f799ce71a668f7942ca0bc1bfefba1b495b563d Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 15 Jan 2026 19:01:21 +0800 Subject: [PATCH] update --- 1 | 5 - .../Controllers/Admin/OtherController.php | 157 +++++++++--------- 统计指标说明.json | 87 ++++++++++ 3 files changed, 169 insertions(+), 80 deletions(-) delete mode 100644 1 create mode 100644 统计指标说明.json diff --git a/1 b/1 deleted file mode 100644 index bedd795..0000000 --- a/1 +++ /dev/null @@ -1,5 +0,0 @@ -Merge branch 'master' of ssh://47.101.48.251:/data/git/wx.sstbc.com -# 请输入一个提交信息以解释此合并的必要性,尤其是将一个更新后的上游分支 -# 合并到主题分支。 -# -# 以 '#' 开始的行将被忽略,而空的提交说明将终止提交。 diff --git a/app/Http/Controllers/Admin/OtherController.php b/app/Http/Controllers/Admin/OtherController.php index aa336b0..aa63728 100755 --- a/app/Http/Controllers/Admin/OtherController.php +++ b/app/Http/Controllers/Admin/OtherController.php @@ -145,8 +145,8 @@ class OtherController extends CommonController // 高层次人才 // 获取人才培训课程 $list['cover_rencai_total'] = CourseSign::rencai(); - // 苏州重点上市公司 - $list['cover_stock_total'] = CourseSign::suzhouStock(); + // 重点上市公司 + $list['cover_stock_total'] = CourseSign::shangshi(); // 培养人次1 $start_date = CourseType::START_DATE; // 默认结束日期一年以后 @@ -794,87 +794,71 @@ class OtherController extends CommonController break; case 'company_market_total': - // 上市公司明细 - 从stock_companys表获取所有上市公司,与coursesHome统计逻辑保持一致 - $stockCompanies = StockCompany::with('company')->get(); + // 上市公司明细 - 与coursesHome统计逻辑保持一致 + // 使用CourseSign::shangshi方法获取数据,确保与统计逻辑一致 + $shangshiList = CourseSign::shangshi($start_date, $end_date, $course_ids, true); + + foreach ($shangshiList as $item) { + $company = $item['company'] ?? null; + $users = $item['users'] ?? []; - foreach ($stockCompanies as $stockCompany) { - // 通过company_id关联到Company表获取详细信息 - $company = $stockCompany->company_id ? $stockCompany->company : null; if (!$company) { - // 如果没有company_id,尝试通过公司名称关联 - $company = Company::where('company_name', $stockCompany->company_name)->first(); + continue; } - // 公司基本信息(只在第一行使用) + // 获取StockCompany信息(如果有) + $stockCompany = StockCompany::where('company_id', $company->id) + ->orWhere('company_name', $company->company_name) + ->first(); + + // 公司基本信息 $companyInfo = [ - 'company_name' => $stockCompany->company_name, + 'company_name' => $company->company_name ?? '', 'company_legal_representative' => $company->company_legal_representative ?? '', 'company_date' => $company->company_date ?? '', 'stock_date' => $stockCompany->stock_date ?? '', - 'is_after_enrollment' => $stockCompany->is_after_enrollment == 1 ? '是' : '否', + 'is_after_enrollment' => $stockCompany && $stockCompany->is_after_enrollment == 1 ? '是' : '否', 'company_address' => $company->company_address ?? '', 'company_city' => $company->company_city ?? '', 'company_area' => $company->company_area ?? '', 'company_tag' => $company->company_tag ?? '', ]; - // 获取该公司的学员信息 - if ($company) { - $users = $company->users() - ->whereHas('courseSigns', function ($q) { - $q->where('status', 1); - }) - ->with([ - 'courseSigns' => function ($query) { - $query->where('status', 1) - ->with(['course.typeDetail']); - } - ]) - ->get(); - - if ($users->isEmpty()) { - // 如果没有学员,仍然导出公司基本信息 - $data[] = array_merge($companyInfo, [ - 'user_name' => '', - 'course_names' => '', - 'course_types' => '', - 'course_count' => 0, - ]); - } else { - // 每个学员一行,每行都显示完整的公司信息 - foreach ($users as $user) { - $courseSigns = $user->courseSigns ?? collect([]); - - // 获取课程名称列表,用中文顿号分隔 - $courseNames = $courseSigns->pluck('course.name')->filter()->unique()->values()->implode('、'); - - // 获取课程体系列表,用中文顿号分隔 - $courseTypes = $courseSigns->pluck('course.typeDetail.name') - ->filter() - ->unique() - ->values() - ->implode('、'); - - // 报名课程数 - $courseCount = $courseSigns->count(); - - // 每个学员一行,每行都显示完整的公司信息 - $data[] = array_merge($companyInfo, [ - 'user_name' => $user->name ?? '', - 'course_names' => $courseNames, - 'course_types' => $courseTypes, - 'course_count' => $courseCount, - ]); - } - } - } else { - // 如果没有关联的公司,只导出基本信息 + if (empty($users)) { + // 如果没有学员,仍然导出公司基本信息 $data[] = array_merge($companyInfo, [ 'user_name' => '', 'course_names' => '', 'course_types' => '', 'course_count' => 0, ]); + } else { + // 每个学员一行,每行都显示完整的公司信息 + foreach ($users as $userData) { + $user = $userData['user'] ?? null; + $courses = $userData['courses'] ?? []; + + if (!$user) { + continue; + } + + // 获取课程名称列表,用中文顿号分隔 + $courseNames = collect($courses)->pluck('course_name')->filter()->unique()->values()->implode('、'); + + // 获取课程体系列表,用中文顿号分隔 + $courseTypes = collect($courses)->pluck('course_type')->filter()->unique()->values()->implode('、'); + + // 报名课程数 + $courseCount = count($courses); + + // 每个学员一行,每行都显示完整的公司信息 + $data[] = array_merge($companyInfo, [ + 'user_name' => $userData['user_name'] ?? $user->name ?? '', + 'course_names' => $courseNames, + 'course_types' => $courseTypes, + 'course_count' => $courseCount, + ]); + } } } $fields = [ @@ -1687,13 +1671,13 @@ class OtherController extends CommonController break; case 'cover_stock_total': - // 苏州重点上市公司明细 - 使用模型方法 - $companiesData = CourseSign::suzhouStock($start_date, $end_date, $course_ids, true); + // 重点上市公司明细 - 使用模型方法 + $companiesData = CourseSign::shangshi($start_date, $end_date, $course_ids, true); foreach ($companiesData as $item) { $company = $item['company']; $users = $item['users'] ?? []; - // 公司基本信息 + // 公司基本信息(只在第一行使用) $companyInfo = [ 'company_name' => $company->company_name, 'company_legal_representative' => $company->company_legal_representative ?? '', @@ -1717,7 +1701,8 @@ class OtherController extends CommonController 'course_count' => 0, ]); } else { - // 每个学员一行,每行都显示完整的公司信息 + // 每个学员一行 + $isFirstRow = true; foreach ($users as $userInfo) { $user = $userInfo['user'] ?? null; $courses = $userInfo['courses'] ?? []; @@ -1738,13 +1723,35 @@ class OtherController extends CommonController $courseCount = count($courses); } - // 每个学员一行,每行都显示完整的公司信息 - $data[] = array_merge($companyInfo, [ - 'user_name' => $userInfo['user_name'] ?? ($user->name ?? ''), - 'course_names' => $courseNames, - 'course_types' => $courseTypes, - 'course_count' => $courseCount, - ]); + if ($isFirstRow) { + // 第一行:显示公司信息 + $data[] = array_merge($companyInfo, [ + 'user_name' => $userInfo['user_name'] ?? ($user->name ?? ''), + 'course_names' => $courseNames, + 'course_types' => $courseTypes, + 'course_count' => $courseCount, + ]); + $isFirstRow = false; + } else { + // 后续行:公司信息为空 + $data[] = [ + 'company_name' => '', + 'company_legal_representative' => '', + 'company_date' => '', + 'stock_date' => '', + 'company_address' => '', + 'company_city' => '', + 'company_area' => '', + 'company_tag' => '', + 'business_scope' => '', + 'contact_phone' => '', + 'contact_mail' => '', + 'user_name' => $userInfo['user_name'] ?? ($user->name ?? ''), + 'course_names' => $courseNames, + 'course_types' => $courseTypes, + 'course_count' => $courseCount, + ]; + } } } } @@ -1765,7 +1772,7 @@ class OtherController extends CommonController 'course_types' => '课程体系', 'course_count' => '报名课程数', ]; - $filename = '苏州重点上市公司明细'; + $filename = '重点上市公司明细'; break; default: diff --git a/统计指标说明.json b/统计指标说明.json new file mode 100644 index 0000000..6a1b165 --- /dev/null +++ b/统计指标说明.json @@ -0,0 +1,87 @@ +{ + "course_signs_total": { + "name": "报名人数", + "from": "1、统计指定时间范围和课程范围内的所有报名记录数量,包括所有状态的报名(待审核、已通过、已拒绝等);2、加上历史课程数据中的人数统计;3、注意:一个学员报名多个课程会计算多次。", + "verify": "" + }, + "course_signs_pass": { + "name": "培养人次(未去重)", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录数量;2、统计历史课程(关联的分类是历史课程,关联的日历是统计人数选项)里满足时间范围内的课程(课程开始或结束时间在时间范围内)培养人数未去重的数据;3、将两部分数据相加得到总数。", + "verify": "报名管理栏目,累加统计对比" + }, + "course_signs_pass_unique": { + "name": "培养人数(已去重)", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录数量按照手机号去重;2、统计历史课程(关联的分类是历史课程,关联的日历是统计人数选项)里满足时间范围内的课程(课程开始或结束时间在时间范围内)培养人数去重的数据;3、将两部分数据相加得到总数。", + "verify": "" + }, + "course_total": { + "name": "开课场次", + "from": "1、统计指定时间范围内、指定课程体系范围内的日历里记录数量", + "verify": "日历里的数据导出对比" + }, + "course_day_total": { + "name": "开课天数", + "from": "1、在开课场次的基础上;2、获取设置了统计天数的记录;3、计算天数总和。", + "verify": "日历里的数据导出对比" + }, + "company_market_total": { + "name": "重点上市公司数", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户总数;2、如果一个用户报名多个课程只算一个有效用户;3、筛选出关联的公司是上市公司的用户数量。", + "verify": "" + }, + "ganbu_total": { + "name": "跟班学员数", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户总数;2、如果一个用户报名多个课程只算一个有效用户;3、筛选出有\"跟班学员\"标签的用户总数。", + "verify": "" + }, + "company_market_year_total": { + "name": "今年上市公司数量", + "from": "1、从自定义的上市公司数据里;2、统计上市年份在今年的公司数量。", + "verify": "" + }, + "company_market_after_enrollment_total": { + "name": "入学后上市公司数量", + "from": "1、直接从上市公司表中查询;2、统计所有标记为\"入学后上市\"的公司数量;3、注意:这个统计不依赖学员报名记录,统计的是自定义的上市的公司。", + "verify": "" + }, + "course_signs_invested": { + "name": "累计被投企业数", + "from": "1、指定课程体系下,从2000-01-01到结束日期的所有课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户关联的公司总数;2、筛选被投企业标签的公司;3、再次筛选存在被投日期在时间范围内的公司总数。", + "verify": "" + }, + "company_invested_after_enrollment_total": { + "name": "入学后被投企业数量", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户关联的公司总数;2、筛选被投企业标签的公司;3、再次筛选存在被投日期并且被投日期在用户报名的课程的开始时间之后的公司数量。", + "verify": "" + }, + "company_invested_year_total": { + "name": "今年被投企业数", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户关联的公司总数;2、筛选出有被投企业标签的公司;3、再次筛选存在被投日期并且被投日期是今年的公司数量。", + "verify": "" + }, + "company_join_total": { + "name": "元和员工参与人数", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下报名记录的用户总数(如果一个用户报名多个课程只算一个有效用户);2、筛选自己填写的公司名称包含以下关键词的用户总数:元禾控股、元禾原点、元禾厚望、元禾重元、元禾璞华、元禾谷风、元禾绿柳、元禾辰坤、元禾沙湖、禾裕集团、苏州科服、信诚管理咨询、集成电路公司、常州团队、国器元禾;3、加上自定义的元禾员工/干部培训数据里满足时间范围内的元禾员工总和;4、将两部分数据相加得到总数。", + "verify": "" + }, + "company_ganbu_total": { + "name": "全市干部参与企业", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户总数(如果一个用户报名多个课程只算一个有效用户);2、加上\"元禾员工/干部培训\"栏目里满足时间范围内的\"元禾员工参与\"记录的参与数量的总和;3、将两部分数据相加得到总数。", + "verify": "学员中心,学员标签筛选对比" + }, + "cover_head_total": { + "name": "苏州头部企业", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户;2、筛选关联的公司包含\"高新技术企业\"字符串的公司;3、统计公司数量。", + "verify": "" + }, + "cover_rencai_total": { + "name": "高层次人才", + "from": "1、统计指定课程体系下的指定时间范围内的课程(课程开始或结束时间在时间范围内)下审核通过的报名记录的用户;2、筛选满足以下条件之一的用户:参加过\"人才培训\"课程类型的用户,或填写的所有报名表单里个人荣誉字段不包含\"其他\"的用户(剩下的选项是国家人才、市级人才等);3、取两者的并集得到用户总数。", + "verify": "" + }, + "cover_stock_total": { + "name": "重点上市公司", + "from": "1、统计在指定时间范围内、指定课程范围内报名的学员;2、通过学员关联到其所在公司;3、筛选出重点上市公司;4、按公司去重统计公司数量;5、注意:与\"上市公司数\"的统计逻辑相同,但筛选的是重点上市公司,同一公司多个学员只计算一次。", + "verify": "" + } +} \ No newline at end of file