fn ($q) => $q->withCount(['activeUserPositions'])->ordered(), ])->ordered()->get(); // 全部职务(供任命白名单多选框使用) $allPositions = Position::with('department')->orderByDesc('rank')->get(); return view('admin.positions.index', compact('departments', 'allPositions')); } /** * 创建职务(同时同步任命白名单) */ public function store(Request $request): RedirectResponse { $data = $request->validate([ 'department_id' => 'required|exists:departments,id', 'name' => 'required|string|max:50', 'icon' => 'nullable|string|max:10', 'rank' => 'required|integer|min:0|max:99', 'level' => 'required|integer|min:1|max:100', 'max_persons' => 'nullable|integer|min:1', 'max_reward' => 'nullable|integer|min:0', 'sort_order' => 'required|integer|min:0', 'appointable_ids' => 'nullable|array', 'appointable_ids.*' => 'exists:positions,id', ]); $appointableIds = $data['appointable_ids'] ?? []; unset($data['appointable_ids']); $position = Position::create($data); // 同步任命白名单(有选则写,没选则清空=无任命权) $position->appointablePositions()->sync($appointableIds); return redirect()->route('admin.positions.index')->with('success', "职务【{$data['name']}】创建成功!"); } /** * 更新职务(含任命白名单同步) */ public function update(Request $request, Position $position): RedirectResponse { $data = $request->validate([ 'department_id' => 'required|exists:departments,id', 'name' => 'required|string|max:50', 'icon' => 'nullable|string|max:10', 'rank' => 'required|integer|min:0|max:99', 'level' => 'required|integer|min:1|max:100', 'max_persons' => 'nullable|integer|min:1', 'max_reward' => 'nullable|integer|min:0', 'sort_order' => 'required|integer|min:0', 'appointable_ids' => 'nullable|array', 'appointable_ids.*' => 'exists:positions,id', ]); $appointableIds = $data['appointable_ids'] ?? []; unset($data['appointable_ids']); $position->update($data); $position->appointablePositions()->sync($appointableIds); return redirect()->route('admin.positions.index')->with('success', "职务【{$data['name']}】更新成功!"); } /** * 删除职务(有在职人员时拒绝) */ public function destroy(Position $position): RedirectResponse { if ($position->isFull() || $position->activeUserPositions()->exists()) { return redirect()->route('admin.positions.index') ->with('error', "职务【{$position->name}】尚有在职人员,请先撤销后再删除。"); } $position->delete(); return redirect()->route('admin.positions.index')->with('success', "职务【{$position->name}】已删除!"); } }