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

Laravel7 FullCalendar3.10.2事件不显示 修正代码实现考勤节假日展示

原有代码问题点
  • 类引用错误:控制器参数request $request未正确引用Request类,会导致请求参数获取失败
  • 查询条件字段错误:查询工作日配置时误用status字段筛选,实际表中对应字段为working_status,导致周末数据查询为空
  • 事件优先级缺失:同一日期同时命中多类规则时会重复渲染事件,未按「法定节假日>周末休息>考勤状态」的规则做过滤
  • 考勤逻辑错误:所有考勤记录统一返回「Leave」标题,未根据leave_cat_id、status字段区分休假、出勤、缺勤三种状态
  • 时间范围不匹配:固定循环42天生成周末数据,未对接FullCalendar传入的视图起止时间,易出现数据缺失或冗余
  • 前端配置冗余:重复声明editable属性,eventRender中allDay判断逻辑无效,3.x版本可直接在事件数据中声明allDay属性
修正后代码

控制器代码

首先确保头部引入相关类:

use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;

业务逻辑代码:

/**
 * 生成指定时间范围内的周末休息事件
 * @param array $weekendDays 配置为休息的星期缩写
 * @param string $start 日历视图开始时间
 * @param string $end 日历视图结束时间
 * @param array $holidayDates 法定节假日日期列表
 * @return array
 */
private function getWeekendEvents($weekendDays, $start, $end, $holidayDates)
{
    $events = [];
    $current = Carbon::parse($start)->startOfDay();
    $endDate = Carbon::parse($end)->startOfDay();

    while ($current->lte($endDate)) {
        $dateStr = $current->format('Y-m-d');
        $weekDay = $current->format('D');
        // 命中休息星期 且 当天不是法定节假日才生成周末事件
        if (in_array($weekDay, $weekendDays) && !in_array($dateStr, $holidayDates)) {
            $events[] = [
                'title' => '周末休息',
                'start' => $dateStr,
                'end' => $dateStr,
                'color' => '#9e9e9e',
                'allDay' => true
            ];
        }
        $current->addDay();
    }
    return $events;
}

public function index(Request $request)
{
    if ($request->ajax()) {
        // 1. 查询配置的休息日星期
        $weekendDays = DB::table('working_days')
            ->where('working_status', 0)
            ->pluck('day')
            ->toArray();

        // 2. 查询法定节假日,同时生成日期数组用于优先级判断
        $holidayList = DB::table('holidays')->get();
        $holidayDates = [];
        $holidayEvents = [];
        foreach ($holidayList as $holiday) {
            $dateStr = Carbon::parse($holiday->date)->format('Y-m-d');
            $holidayDates[] = $dateStr;
            $holidayEvents[] = [
                'title' => '法定节假日',
                'start' => $dateStr,
                'end' => $dateStr,
                'color' => '#2196f3',
                'allDay' => true
            ];
        }

        // 3. 生成周末事件,同时提取周末日期数组
        $weekendEvents = $this->getWeekendEvents($weekendDays, $request->start, $request->end, $holidayDates);
        $weekendDates = array_column($weekendEvents, 'start');

        // 4. 查询当前视图范围内的考勤记录,过滤掉节假日、周末的考勤数据
        $attendanceEvents = DB::table('attendances')
            ->where('user_id', Auth::id())
            ->whereBetween('date', [
                Carbon::parse($request->start)->format('Y-m-d'),
                Carbon::parse($request->end)->format('Y-m-d')
            ])
            ->get()
            ->map(function ($item) use ($holidayDates, $weekendDates) {
                $dateStr = Carbon::parse($item->date)->format('Y-m-d');
                // 节假日、周末不展示考勤事件
                if (in_array($dateStr, $holidayDates) || in_array($dateStr, $weekendDates)) {
                    return null;
                }
                // 按规则匹配考勤状态
                if (!is_null($item->leave_cat_id)) {
                    return [
                        'title' => '休假',
                        'start' => $dateStr,
                        'end' => $dateStr,
                        'color' => '#f44336',
                        'allDay' => true
                    ];
                }
                if ($item->status == 1) {
                    return [
                        'title' => '出勤',
                        'start' => $dateStr,
                        'end' => $dateStr,
                        'color' => '#4caf50',
                        'allDay' => true
                    ];
                }
                return [
                    'title' => '缺勤',
                    'start' => $dateStr,
                    'end' => $dateStr,
                    'color' => '#ff9800',
                    'allDay' => true
                ];
            })
            ->filter()
            ->values()
            ->toArray();

        // 合并所有事件返回
        return response()->json(array_merge($holidayEvents, $weekendEvents, $attendanceEvents));
    }

    return view('admin.dashboard');
}

Blade模板脚本代码

<script>
$(document).ready(function () {
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    $('#full-calendar').fullCalendar({
        editable: false,
        events: {
            url: '/dashboard',
            type: 'GET',
            error: function () {
                console.log('日历事件加载异常');
            }
        }
    });
});
</script>
效果说明
  • 事件优先级符合要求:法定节假日、周末休息的日期不会重复展示考勤事件
  • 不同类型事件用颜色区分:节假日蓝色、周末灰色、休假红色、出勤绿色、缺勤橙色,辨识度高
  • 所有数据按日历视图范围查询,无冗余数据,加载效率更高
  • 直接在事件数据中声明allDay: true,兼容FullCalendar 3.10.2版本解析规则,无需额外渲染处理

内容的提问来源于stack exchange,提问作者Shan Md Shazarul Haque 171-15-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:06:19