You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
3.7 KiB
PHP

<?php
namespace App\Http\Controllers\API\Admin;
use App\Http\Controllers\Controller;
use App\Lib\Rs;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class BodyPartController extends Controller
{
/**
* 获取部位列表(树形结构)
*/
public function list(Request $request)
{
$name = $request->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();
}
}