|
|
@@ -805,6 +805,110 @@ class ExportFileService extends Service
|
|
|
return [true, $filename];
|
|
|
}
|
|
|
|
|
|
+ // 人员活动考勤占比
|
|
|
+ public function exportActivityTimeCard(array $data, $user)
|
|
|
+ {
|
|
|
+ $service = new StatisticService();
|
|
|
+ // 1. 获取统计数据
|
|
|
+ list($status, $result) = $service->itemEmployeeSalaryStatistic($data, $user);
|
|
|
+ if (!$status) return [false, $result];
|
|
|
+
|
|
|
+ $rawList = collect($result ?? []);
|
|
|
+
|
|
|
+ // 2. 按 项目名称 和 年度 联合分组
|
|
|
+ $groupedData = $rawList->groupBy(function ($item) {
|
|
|
+ $year = substr($item['month'] ?? date('Y'), 0, 4);
|
|
|
+ return $year . "-" . $item['item_title'];
|
|
|
+ });
|
|
|
+
|
|
|
+ $allProjectsData = [];
|
|
|
+
|
|
|
+ foreach ($groupedData as $groupKey => $records) {
|
|
|
+ list($year, $projectTitle) = explode('-', $groupKey);
|
|
|
+
|
|
|
+ $projectRows = [];
|
|
|
+ $groupedByMonth = $records->groupBy('month');
|
|
|
+
|
|
|
+ foreach ($groupedByMonth as $monthStr => $monthRecords) {
|
|
|
+ $monthNum = substr($monthStr, 5, 2);
|
|
|
+ $monthSubTotal = array_fill(3, 15, 0); // 索引3-17的累加器
|
|
|
+
|
|
|
+ foreach ($monthRecords as $v) {
|
|
|
+ $radioVal = (float)($v['radio'] ?? 0);
|
|
|
+ $row = [
|
|
|
+ (int)$monthNum . '月', // 0. 月份
|
|
|
+ $v['major'] ?? '', // 1. 类别
|
|
|
+ $v['employee_title'] ?? '', // 2. 姓名
|
|
|
+ (float)$v['total_min'], // 3. 应出勤
|
|
|
+ (float)$v['work_minutes'], // 4. 研发出勤
|
|
|
+ ($radioVal * 100) . '%', // 5. 占比 (字符串)
|
|
|
+ (float)$v['salary'], // 6. 归集工资
|
|
|
+ (float)$v['social_insurance'],// 7. 归集社保
|
|
|
+ (float)$v['public_housing_fund'], // 8. 归集公积金
|
|
|
+ (float)$v['work_salary'], // 9. 确定工资
|
|
|
+ (float)$v['work_social_insurance'], // 10. 确定社保
|
|
|
+ (float)$v['work_public_housing_fund'], // 11. 确定公积金
|
|
|
+ (float)$v['work_salary'], // 12. 研发确定总工资
|
|
|
+ (float)$v['work_social_insurance'], // 13. 研发确定总社保
|
|
|
+ (float)$v['work_public_housing_fund'], // 14. 研发确定总公积金
|
|
|
+ 0, 0, 0 // 15, 16, 17. 调整金额
|
|
|
+ ];
|
|
|
+ $projectRows[] = $row;
|
|
|
+
|
|
|
+ // 累加月份小计 (跳过索引5的百分比字符串)
|
|
|
+ for ($i = 3; $i <= 14; $i++) {
|
|
|
+ if ($i == 5) continue;
|
|
|
+ $monthSubTotal[$i] += (float)$row[$i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构造月份小计行 (重新计算占比)
|
|
|
+ $mRadio = $monthSubTotal[3] > 0 ? round($monthSubTotal[4] / $monthSubTotal[3] * 100, 2) . '%' : '0%';
|
|
|
+ $projectRows[] = [
|
|
|
+ '小计:', '', '', $monthSubTotal[3], $monthSubTotal[4], $mRadio,
|
|
|
+ $monthSubTotal[6], $monthSubTotal[7], $monthSubTotal[8],
|
|
|
+ $monthSubTotal[9], $monthSubTotal[10], $monthSubTotal[11],
|
|
|
+ $monthSubTotal[12], $monthSubTotal[13], $monthSubTotal[14],
|
|
|
+ 0, 0, 0
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算整年合计 (避开小计行,避开非数字)
|
|
|
+ $yearTotal = array_fill(3, 15, 0);
|
|
|
+ foreach ($projectRows as $row) {
|
|
|
+ if ($row[0] !== '小计:' && $row[0] !== '合计') {
|
|
|
+ for ($i = 3; $i <= 14; $i++) {
|
|
|
+ if ($i == 5) continue;
|
|
|
+ $yearTotal[$i] += (float)$row[$i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $yRadio = $yearTotal[3] > 0 ? round($yearTotal[4] / $yearTotal[3] * 100, 2) . '%' : '0%';
|
|
|
+ $projectRows[] = [
|
|
|
+ '合计', '', '', $yearTotal[3], $yearTotal[4], $yRadio,
|
|
|
+ $yearTotal[6], $yearTotal[7], $yearTotal[8],
|
|
|
+ $yearTotal[9], $yearTotal[10], $yearTotal[11],
|
|
|
+ $yearTotal[12], $yearTotal[13], $yearTotal[14],
|
|
|
+ 0, 0, 0
|
|
|
+ ];
|
|
|
+
|
|
|
+ $allProjectsData[$groupKey] = [
|
|
|
+ 'project' => $projectTitle,
|
|
|
+ 'year' => $year,
|
|
|
+ 'data' => $projectRows
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
+ $filename = "人员活动考勤占比统计表_" . date("YmdHis") . '.xlsx';
|
|
|
+ \Maatwebsite\Excel\Facades\Excel::store(
|
|
|
+ new \App\Exports\ManActivityTimeCardMultipleSheetExport($allProjectsData),
|
|
|
+ "public/export/{$filename}"
|
|
|
+ );
|
|
|
+
|
|
|
+ return [true, $filename];
|
|
|
+ }
|
|
|
+
|
|
|
public function saveExportData($data, $headers, $type = 'default',$file_name = ''){
|
|
|
if(empty($file_name)) $file_name = self::$filename . "_". date("Y-m-d") . "_". rand(1000,9999);
|
|
|
$filename = $file_name . '.' . 'xlsx';
|