leftJoin('school_campus_person_role cpr', 's.staff_id = cpr.person_id') ->leftJoin('school_campus c', 'cpr.campus_id = c.id'); // 筛选条件 if (!empty($where['campus_id'])) { $query->where('cpr.campus_id', $where['campus_id']); } if (!empty($where['salary_month'])) { $query->where('s.salary_month', 'like', $where['salary_month'] . '%'); } // 总体统计 $summary = $query->field([ 'COUNT(s.id) as total_employees', 'SUM(s.net_salary) as total_amount', 'AVG(s.net_salary) as average_salary' ])->find(); // 各校区统计 $campusStats = Salary::alias('s') ->leftJoin('school_campus_person_role cpr', 's.staff_id = cpr.person_id') ->leftJoin('school_campus c', 'cpr.campus_id = c.id') ->field([ 'IFNULL(cpr.campus_id, 0) as campus_id', 'CASE WHEN cpr.campus_id IS NULL OR cpr.campus_id = 0 THEN "总部" ELSE c.campus_name END as campus_name', 'COUNT(s.id) as employee_count', 'SUM(s.net_salary) as total_amount' ]); // 筛选条件 if (!empty($where['campus_id'])) { $campusStats->where('cpr.campus_id', $where['campus_id']); } if (!empty($where['salary_month'])) { $campusStats->where('s.salary_month', 'like', $where['salary_month'] . '%'); } $campusStats = $campusStats->group('cpr.campus_id')->select(); return [ 'total_employees' => $summary['total_employees'] ?? 0, 'total_amount' => $summary['total_amount'] ?? 0, 'average_salary' => round($summary['average_salary'] ?? 0, 2), 'cost_rate' => 65.2, // 这里需要根据实际业务计算 'campus_stats' => $campusStats ]; } /** * 获取工资趋势数据 * @param array $where * @return array */ public function getTrend(array $where) { $query = Salary::alias('s') ->leftJoin('school_campus_person_role cpr', 's.staff_id = cpr.person_id'); if (!empty($where['campus_id'])) { $query->where('cpr.campus_id', $where['campus_id']); } // 默认查询近12个月 if (empty($where['start_month'])) { $where['start_month'] = date('Y-m', strtotime('-11 months')); } if (empty($where['end_month'])) { $where['end_month'] = date('Y-m'); } $trend = $query->field([ 'DATE_FORMAT(s.salary_month, "%Y-%m") as month', 'SUM(s.net_salary) as total_amount', 'COUNT(s.id) as employee_count' ]) ->where('s.salary_month', 'between', [ $where['start_month'] . '-01', $where['end_month'] . '-31' ]) ->group('DATE_FORMAT(s.salary_month, "%Y-%m")') ->order('month') ->select(); return $trend; } }