Laravel 10实现操作员月度工时统计及关联工单数量求助
Laravel 10 月度操作员工时统计改造问题
我用Laravel 10开发系统,现有代码能统计每位操作员每日及每月的耗时总数,现在想改成月度统计——展示每位操作员的月度总工时,以及他们参与的工单数量,但代码修改一直没成功。当前Blade文件里的代码如下:
<tbody> @foreach($response as $value) @foreach($value as $val) <tr> <td> @php $date = strtotime($val['date_logs']); $dat = date('m-Y', $date); @endphp {{ $dat }} </td> <td>{{ $val['operator_name'] }}</td> @if($val['time_spent'] !=0) @php $val['time_spent'] = $val['time_spent']*60; $minsec = gmdate("i:s", $val['time_spent']); $hours = (gmdate("d", $val['time_spent'])-1)*24 + gmdate("H", $val['time_spent']); $totalHours = $hours.':'.$minsec; @endphp @else @php $totalHours =0; @endphp @endif <td>{{ $totalHours }}</td> <td>{{ $val['ticket_no'] }}</td> </tr> @endforeach @endforeach </tbody>
改造思路和修正代码
要实现需求,核心是先在后端把数据按「操作员+月份」聚合好,再简化前端模板的渲染逻辑:
后端数据处理(关键步骤)
用Laravel的查询构造器或Eloquent,按操作员和月份分组,统计两个核心数据:- 月度总工时:
sum('time_spent')(注意统一单位,比如存的是分钟就直接求和) - 工单数量:
count(DISTINCT 'ticket_no')(去重统计,避免重复工单被多次计数)
最终返回的$response结构参考:
[ ['month' => '09-2024', 'operator_name' => '张三', 'total_time_spent' => 1200, 'ticket_count' => 15], ['month' => '09-2024', 'operator_name' => '李四', 'total_time_spent' => 950, 'ticket_count' => 12], // ...更多数据 ]- 月度总工时:
前端Blade模板修正
去掉原来的双层循环,直接遍历聚合后的统计数据,同时简化工时转换逻辑(用数学运算替代容易出问题的gmdate):
<tbody> @foreach($response as $stat) <tr> <td>{{ $stat['month'] }}</td> <td>{{ $stat['operator_name'] }}</td> <td> @php // 假设后端返回的total_time_spent是分钟数,转成总秒数 $totalSeconds = $stat['total_time_spent'] * 60; if ($totalSeconds > 0) { $hours = floor($totalSeconds / 3600); $minutes = floor(($totalSeconds % 3600) / 60); $seconds = $totalSeconds % 60; // 格式化时分秒,确保补零 $totalHours = sprintf('%d:%02d:%02d', $hours, $minutes, $seconds); } else { $totalHours = '0:00:00'; } @endphp {{ $totalHours }} </td> <td>{{ $stat['ticket_count'] }}</td> </tr> @endforeach </tbody>
注意点
- 后端聚合时要用
DATE_FORMAT(date_logs, "%m-%Y")或者DATE_TRUNC('month', date_logs)(根据数据库类型调整)来分组月份,确保同一月份的统计被合并 - 如果
time_spent存的是秒数,后端求和后就不用乘以60,直接在模板里计算时分秒即可
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

