Laravel请假申请审批通过后用户总年假额度未正常扣除问题咨询
问题排查
- 审批逻辑
approval方法未调用扣减余额的leaveBalance方法,审批通过后没有触发余额更新流程 approval方法的条件判断误用赋值运算符=而非比较运算符==,虽然实际能修改状态,但逻辑完全不符合预期,无法正确判断审批操作类型leaveBalance方法存在多处逻辑错误:- 无意义查询所有请假申请
Application::all(),未关联当前审批的请假单 - 从请求参数
$request->days_taken取请假天数,但审批请求通常不会传递该参数,应该直接从对应请假单中读取已存储的days_taken - 传入的
$id参数语义不明确,如果是请假申请ID,直接查User::find($id)完全找不到对应用户
- 无意义查询所有请假申请
- 你尝试的修改代码存在语法错误:
auth()->user(-漏写右括号,会直接抛出语法错误无法运行 - 缺少重复扣减校验:如果已审批通过的申请重复触发审批操作,会导致余额重复扣减
修复方案
推荐直接将余额扣减逻辑合并到审批方法中,不需要单独拆出leaveBalance方法,简化逻辑:
public function approval(Request $request, $id) { $leaverequest = Application::findOrFail($id); // 已审批的申请不允许重复操作,0是待审批状态、1是通过、2是驳回,可按你实际枚举值调整 if ($leaverequest->status != 0) { return redirect()->back()->with('error', '该申请已完成审批,无法重复操作'); } // 正确使用比较运算符判断操作类型 if ($request->approve) { $leaverequest->status = 1; // 审批通过,仅年假类型(leave_id=1)需要扣减余额 if ($leaverequest->leave_id == 1) { $user = User::findOrFail($leaverequest->user_id); // 二次校验余额避免并发问题导致余额为负 if ($user->total_annual >= $leaverequest->days_taken) { $user->decrement('total_annual', $leaverequest->days_taken); } else { return redirect()->back()->with('error', '用户年假余额不足,无法审批通过'); } } $leaverequest->save(); return redirect()->back()->with('success', '审批通过'); } elseif ($request->reject) { $leaverequest->status = 2; $leaverequest->save(); return redirect()->back()->with('success', '已驳回申请'); } return redirect()->back(); }
如果你需要保留单独的leaveBalance方法,修正后在审批通过时调用即可:
public function leaveBalance(Application $leaverequest) { // 仅年假类型且审批通过才扣减余额 if ($leaverequest->leave_id == 1 && $leaverequest->status == 1) { $user = User::findOrFail($leaverequest->user_id); $user->decrement('total_annual', $leaverequest->days_taken); } }
内容的提问来源于stack exchange,提问作者wartortle
相关产品推荐
相关产品推荐

