You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

改造思路和修正代码

要实现需求,核心是先在后端把数据按「操作员+月份」聚合好,再简化前端模板的渲染逻辑:

  1. 后端数据处理(关键步骤)
    用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],
        // ...更多数据
    ]
    
  2. 前端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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:46:15