diff --git a/app/Models/Course.php b/app/Models/Course.php index 3fac59e..938673b 100755 --- a/app/Models/Course.php +++ b/app/Models/Course.php @@ -6,6 +6,7 @@ namespace App\Models; use EasyWeChat\Factory; use Illuminate\Filesystem\Filesystem; +use App\Models\Config; class Course extends SoftDeletesModel { @@ -299,97 +300,20 @@ class Course extends SoftDeletesModel /** * 获取课程统计项元数据 * 返回每个统计项的计算逻辑和验证方法说明 + * 从 configs 表中读取,key = 'statistics_metadata' * @return array */ public static function getStatisticsMetadata() { - return [ - 'course_signs_total' => [ - 'name' => '报名人数', - 'from' => '统计在指定时间范围内、指定课程范围内的所有报名记录数量。包括所有状态的报名(待审核、已通过、已拒绝等),同时会加上历史课程数据中的人数统计。一个学员报名多个课程会计算多次。', - 'verify' => '' - ], - 'course_signs_pass' => [ - 'name' => '审核通过人数', - 'from' => '统计在指定时间范围内、指定课程范围内审核通过的报名记录数量。只统计状态为"已通过"的报名,不包括待审核、已拒绝等其他状态。同时会加上历史课程数据中已通过的人数统计。一个学员报名多个课程会计算多次。', - 'verify' => '' - ], - 'course_signs_pass_unique' => [ - 'name' => '审核通过人数去重', - 'from' => '统计在指定时间范围内、指定课程范围内审核通过的学员人数(按学员去重)。与"审核通过人数"的区别是:如果同一个学员报名了多个课程,这里只计算一次。通过学员的手机号进行去重,确保每个学员只统计一次。同时会加上历史课程数据中去重后的人数统计。', - 'verify' => '' - ], - 'course_total' => [ - 'name' => '开课场次', - 'from' => '统计在指定时间范围内、指定课程体系范围内的开课场次数。一个课程可能有多个场次(比如分多天上课),这里统计的是场次数,不是课程数。只要场次的开始时间或结束时间在指定时间范围内,就会被统计。', - 'verify' => '' - ], - 'course_day_total' => [ - 'name' => '开课天数', - 'from' => '统计在指定时间范围内、指定课程体系范围内的开课天数总和。只统计标记为"需要统计天数"的场次,每个场次可能有不同的天数(比如3天、5天等),将所有场次的天数相加得到总天数。', - 'verify' => '' - ], - 'company_market_total' => [ - 'name' => '上市公司数', - 'from' => '统计在指定时间范围内、指定课程范围内报名的学员中,所在公司为上市公司的公司数量。通过学员关联到其所在公司,筛选出已上市的公司,然后按公司去重统计。如果同一公司有多个学员报名,只计算一次。', - 'verify' => '' - ], - 'ganbu_total' => [ - 'name' => '跟班学员数', - 'from' => '统计在指定时间范围内、指定课程范围内的跟班学员人数。筛选条件:1)学员的"来源"字段包含"跟班学员";2)课程类型标记为"需要统计跟班学员"。同时会加上员工参与表中的额外数据。按学员去重,同一学员只计算一次。', - 'verify' => '' - ], - 'company_market_year_total' => [ - 'name' => '今年上市公司数量', - 'from' => '统计所有在今年(当前年份)上市的公司数量。直接从上市公司表中查询,统计上市日期在今年内的公司。这个统计不依赖学员报名记录,统计的是所有在今年上市的公司,不管是否有学员报名。', - 'verify' => '' - ], - 'company_market_after_enrollment_total' => [ - 'name' => '入学后上市公司数量', - 'from' => '统计所有标记为"入学后上市"的公司数量。直接从上市公司表中查询,统计标记为"入学后上市"的公司。这个统计不依赖学员报名记录,统计的是所有在学员入学后才上市的公司。', - 'verify' => '' - ], - 'course_signs_invested' => [ - 'name' => '累计被投企业数', - 'from' => '统计从课程开始日期到结束日期,在指定课程范围内报名的学员中,所在公司为被投企业的公司数量。通过学员关联到其所在公司,筛选出标记为"被投企业"的公司,检查公司的被投时间是否在截止日期之前(或没有记录被投时间),然后按公司去重统计。同一公司多个学员只计算一次。', - 'verify' => '' - ], - 'company_invested_after_enrollment_total' => [ - 'name' => '入学后被投企业数量', - 'from' => '统计在指定时间范围内报名的学员中,所在公司在学员入学后被投的公司数量。以学员报名的课程开课时间作为"入学时间",筛选出公司的被投时间晚于入学时间的公司,然后按公司去重统计。同一公司多个学员只计算一次。', - 'verify' => '' - ], - 'company_invested_year_total' => [ - 'name' => '今年被投企业数', - 'from' => '统计在指定时间范围内报名的学员中,所在公司在指定年份范围内被投的公司数量。从开始日期和结束日期中提取年份范围,筛选出公司的被投时间在指定年份范围内的公司,然后按公司去重统计。同一公司多个学员只计算一次。', - 'verify' => '' - ], - 'company_join_total' => [ - 'name' => '元和员工参与人数', - 'from' => '统计在指定时间范围内、指定课程范围内报名的学员中,所在公司为元和投资公司的学员人数。通过学员关联到其所在公司,筛选出元和投资的公司,然后按学员去重统计。同一学员报名多个课程只计算一次。', - 'verify' => '' - ], - 'company_ganbu_total' => [ - 'name' => '全市干部参与企业', - 'from' => '统计在指定时间范围内、指定课程范围内报名的学员中,来源为"跟班学员"且课程类型标记为"需要统计跟班学员"的学员人数。与"跟班学员数"的统计逻辑相同,同时会加上员工参与表中的额外数据。按学员去重,同一学员只计算一次。', - 'verify' => '' - ], - 'cover_head_total' => [ - 'name' => '苏州头部企业', - 'from' => '统计在指定时间范围内、指定课程范围内报名的学员中,所在公司为苏州头部企业的公司数量。通过学员关联到其所在公司,筛选出标记为"苏州头部企业"的公司,然后按公司去重统计。同一公司多个学员只计算一次。', - 'verify' => '' - ], - 'cover_rencai_total' => [ - 'name' => '高层次人才', - 'from' => '统计在指定时间范围内、指定课程范围内报名的学员中,标记为"高层次人才"的学员人数。通过学员的个人信息(如学历等)判断是否为高层次人才,然后按学员去重统计。同一学员报名多个课程只计算一次。', - 'verify' => '' - ], - 'cover_stock_total' => [ - 'name' => '重点上市公司', - 'from' => '统计在指定时间范围内、指定课程范围内报名的学员中,所在公司为重点上市公司的公司数量。通过学员关联到其所在公司,筛选出重点上市公司,然后按公司去重统计。与"上市公司数"的统计逻辑相同,但筛选的是重点上市公司。同一公司多个学员只计算一次。', - 'verify' => '' - ], - ]; + $value = Config::getValueByKey('statistics_metadata'); + if ($value) { + $data = json_decode($value, true); + if (json_last_error() === JSON_ERROR_NONE && is_array($data)) { + return $data; + } + } + // 如果数据库中没有数据或解析失败,返回空数组 + return []; } }