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

Laravel工单处理功能失效:审批/驳回流程无法正常执行

Laravel工单审批/驳回无响应问题排查方案

问题明确

原本正常的工单提交流程出异常:

  • 点击审批仅显示模态框加载状态,无后续处理动作
  • 点击驳回完全没有任何响应
    需求是根据审批/驳回决策,将工单分别转移至fulfillmentcases或declinecases表,怀疑多提交按钮冲突是核心诱因。

一、先排查多提交按钮的识别问题

多个提交按钮共存时,后端必须能明确区分触发动作,否则会出现请求意图无法识别的情况。

1. 检查HTML按钮的命名规范

给每个按钮添加唯一的name和value,让后端能精准识别触发源:

<!-- 审批按钮 -->
<button type="submit" name="case_action" value="approve" class="btn btn-success">审批</button>

<!-- 驳回按钮 -->
<button type="submit" name="case_action" value="reject" class="btn btn-danger">驳回</button>

也可以用不同的name属性区分:

<button type="submit" name="approve_case" value="1" class="btn btn-success">审批</button>
<button type="submit" name="reject_case" value="1" class="btn btn-danger">驳回</button>

2. 控制器添加分支判断逻辑

在CaseController的处理方法中,根据按钮传递的值执行对应逻辑:

public function handleCase(Request $request, $id)
{
    $case = \App\Models\CaseModel::findOrFail($id);

    // 根据按钮动作分支处理
    if ($request->case_action === 'approve') {
        // 转移至fulfillmentcases表
        $fulfillment = new \App\Models\FulfillmentCase();
        $fulfillment->fill($case->attributesToArray());
        $fulfillment->save();
        $case->delete();
    } elseif ($request->case_action === 'reject') {
        // 转移至declinecases表
        $decline = new \App\Models\DeclineCase();
        $decline->fill($case->attributesToArray());
        $decline->save();
        $case->delete();
    }

    return redirect()->back()->with('msg', '工单处理完成');
}

如果使用不同name的按钮,判断逻辑改为:

if ($request->has('approve_case')) {
    // 审批逻辑
} elseif ($request->has('reject_case')) {
    // 驳回逻辑
}

二、排查JS模态框的提交逻辑问题

如果用JS控制模态框和表单提交,大概率是逻辑阻塞或请求未正常发送:

1. 审批模态框的AJAX提交检查

若审批流程是先弹出模态框再提交,需确保AJAX请求正常发送并携带动作标识:

// 绑定模态框表单提交事件
$('#approveModalForm').on('submit', function(e) {
    e.preventDefault();
    let formData = $(this).serialize();
    let caseId = $(this).data('case-id');

    $.ajax({
        url: `/cases/${caseId}/handle`,
        method: 'POST',
        data: formData + '&case_action=approve', // 明确传递动作参数
        beforeSend: function() {
            $('#modalLoading').show(); // 显示加载状态
        },
        success: function(res) {
            $('#approveModal').modal('hide');
            location.reload(); // 刷新页面更新工单状态
        },
        error: function(xhr) {
            $('#modalLoading').hide();
            alert('审批失败:' + xhr.responseText);
        }
    });
});

注意:模态框内的表单需正确绑定工单ID,避免传递错误参数。

2. 驳回按钮的JS绑定检查

驳回按钮无动作,优先排查以下几点:

  • 按钮的选择器是否正确(类名/ID与JS代码中的定义是否匹配)
  • 打开浏览器控制台(F12>Console)查看是否存在JS语法错误
  • 是否有其他JS代码覆盖了驳回按钮的事件绑定

三、路由与CSRF令牌验证

1. 路由定义需匹配请求方式

确保工单处理的路由为POST/PUT类型:

// web.php
Route::post('/cases/{case}/handle', [CaseController::class, 'handleCase'])->name('cases.handle');

2. CSRF令牌必须正确传递

表单内必须包含CSRF令牌:

<form id="approveModalForm" data-case-id="{{ $case->id }}">
    @csrf
    <!-- 表单内容 -->
</form>

使用AJAX提交时,需全局配置CSRF请求头:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

四、数据库操作添加异常捕获

若数据库操作失败(如字段不匹配、外键约束冲突),会静默无响应,需在控制器中添加异常捕获:

try {
    // 审批转移逻辑
    $fulfillment = new \App\Models\FulfillmentCase();
    $fulfillment->fill($case->attributesToArray());
    $fulfillment->save();
    $case->delete();
} catch (\Exception $e) {
    \Log::error('工单审批失败:' . $e->getMessage());
    return redirect()->back()->with('error', '审批失败,请查看日志排查');
}

可前往storage/logs/laravel.log查看具体报错信息。


内容的提问来源于stack exchange,提问作者Dangelo Antoine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:46:16