input('name', ''); $status = $request->input('status', null); $query = DB::table('exam_body_part') ->where('deleted', 0); if (!empty($name)) { $query->where('name', 'like', '%' . $name . '%'); } if ($status !== null) { $query->where('status', $status); } $allParts = $query->orderBy('sort_order', 'asc') ->orderBy('id', 'asc') ->get(); // 构建树形结构 $tree = []; $childrenMap = []; foreach ($allParts as $part) { if ($part->parent_id === null) { $tree[] = $part; } else { if (!isset($childrenMap[$part->parent_id])) { $childrenMap[$part->parent_id] = []; } $childrenMap[$part->parent_id][] = $part; } } foreach ($tree as &$parent) { $parent->children = $childrenMap[$parent->id] ?? []; } return Rs::success($tree); } /** * 获取所有启用部位(平铺列表,用于下拉选择) */ public function getAll() { $list = DB::table('exam_body_part') ->where('deleted', 0) ->where('status', 1) ->orderBy('sort_order', 'asc') ->orderBy('id', 'asc') ->get(); return Rs::success($list); } /** * 新增/编辑部位 */ public function save(Request $request) { $data = $request->validate([ 'id' => 'required|integer', 'code' => 'required|string|max:20', 'name' => 'required|string|max:100', 'parent_id' => 'nullable|integer', 'sort_order' => 'nullable|integer', 'status' => 'required|integer|in:0,1', ]); // 检查编码唯一性 $exists = DB::table('exam_body_part') ->where('code', $data['code']) ->where('id', '!=', $data['id']) ->where('deleted', 0) ->exists(); if ($exists) { return Rs::error('部位编码已存在'); } $conditions = ['id' => $data['id']]; $values = [ 'code' => $data['code'], 'name' => $data['name'], 'parent_id' => $data['parent_id'] ?? null, 'sort_order' => $data['sort_order'] ?? 0, 'status' => $data['status'], ]; DB::table('exam_body_part')->updateOrInsert($conditions, $values); return Rs::success(); } /** * 删除部位 */ public function delete(Request $request) { $data = $request->validate([ 'id' => 'required|integer', ]); // 检查是否有子部位 $hasChildren = DB::table('exam_body_part') ->where('parent_id', $data['id']) ->where('deleted', 0) ->exists(); if ($hasChildren) { return Rs::error('该部位下存在子部位,无法删除'); } // 检查是否有项目关联 $hasItems = DB::table('exam_item_body_part') ->where('body_part_id', $data['id']) ->exists(); if ($hasItems) { return Rs::error('该部位已被检查项目关联,无法删除'); } DB::table('exam_body_part')->where('id', $data['id'])->update(['deleted' => 1]); return Rs::success(); } }