input('name', ''); $status = $request->input('status', null); $page = $request->input('page', 1); $pageSize = $request->input('page_size', 10); $query = DB::table('exam_item_class') ->where('deleted', 0) ->where(function($q) { $q->where('pid', 0)->orWhereNull('pid'); }); if (!empty($name)) { $query->where('name', 'like', '%' . $name . '%'); } if ($status !== null) { $query->where('status', $status); } $total = $query->count(); $list = $query->orderBy('id', 'asc') ->skip(($page - 1) * $pageSize) ->take($pageSize) ->get(); return Rs::success([ 'list' => $list, 'total' => $total, 'page' => $page, 'page_size' => $pageSize, 'total_pages' => ceil($total / $pageSize) ]); } /** * 获取子类列表(exam_item_class表中pid>0) */ public function getSubClassList(Request $request) { $bigClassId = $request->input('big_class_id', ''); $name = $request->input('name', ''); $status = $request->input('status', null); $page = $request->input('page', 1); $pageSize = $request->input('page_size', 10); $query = DB::table('exam_item_class') ->where('deleted', 0) ->where('pid', '>', 0); if (!empty($bigClassId)) { $query->where('pid', $bigClassId); } if (!empty($name)) { $query->where('name', 'like', '%' . $name . '%'); } if ($status !== null) { $query->where('status', $status); } $total = $query->count(); $list = $query->orderBy('id', 'asc') ->skip(($page - 1) * $pageSize) ->take($pageSize) ->get(); return Rs::success([ 'list' => $list, 'total' => $total, 'page' => $page, 'page_size' => $pageSize, 'total_pages' => ceil($total / $pageSize) ]); } /** * 获取项目列表(exam_item表) */ public function getItemList(Request $request) { $classId = $request->input('class_id', ''); $bigClassId = $request->input('big_class_id', ''); $name = $request->input('name', ''); $code = $request->input('code', ''); $status = $request->input('status', null); $page = $request->input('page', 1); $pageSize = $request->input('page_size', 10); $query = DB::table('exam_item as ei') ->leftJoin('exam_item_class as sub_class', 'ei.class_id', '=', 'sub_class.id') ->leftJoin('exam_item_class as big_class', 'sub_class.pid', '=', 'big_class.id') ->where('ei.deleted', 0) ->select( 'ei.*', 'big_class.id as big_class_id', 'big_class.name as big_class_name', 'sub_class.name as sub_class_name' ); if (!empty($classId)) { $query->where('ei.class_id', $classId); } if (!empty($bigClassId)) { $query->where('sub_class.pid', $bigClassId); } if (!empty($name)) { $query->where(function($q) use ($name) { $q->where('ei.name', 'like', '%' . $name . '%') ->orWhere('ei.code', 'like', '%' . $name . '%'); }); } if (!empty($code)) { $query->where('ei.code', 'like', '%' . $code . '%'); } if ($status !== null) { $query->where('ei.status', $status); } $total = $query->count(); $list = $query->orderBy('ei.id', 'asc') ->skip(($page - 1) * $pageSize) ->take($pageSize) ->get(); // 为每个项目加载资源信息 foreach ($list as $item) { $resources = DB::table('exam_item_resource as eir') ->leftJoin('department_resource as dr', 'eir.resource_id', '=', 'dr.id') ->where('eir.item_id', $item->id) ->where('eir.deleted', 0) ->select('dr.id', 'dr.name') ->get(); $item->resources = $resources; // 加载关联部位 $bodyParts = DB::table('exam_item_body_part as eibp') ->join('exam_body_part as ebp', 'eibp.body_part_id', '=', 'ebp.id') ->where('eibp.item_id', $item->id) ->where('ebp.deleted', 0) ->select('ebp.id', 'ebp.code', 'ebp.name', 'ebp.parent_id') ->orderBy('ebp.sort_order', 'asc') ->get(); $item->body_parts = $bodyParts; } return Rs::success([ 'list' => $list, 'total' => $total, 'page' => $page, 'page_size' => $pageSize, 'total_pages' => ceil($total / $pageSize) ]); } /** * 保存大类 */ public function saveBigClass(Request $request) { $data = $request->validate([ 'id' => 'required|integer', 'code' => 'sometimes|string|max:50', 'name' => 'required|string|max:255', 'status' => 'required|integer|in:0,1', ]); $conditions = ['id' => $data['id']]; $values = [ 'code' => $data['code'] ?? '', 'name' => $data['name'], 'status' => $data['status'], 'pid' => 0, ]; $updated = DB::table('exam_item_class')->updateOrInsert($conditions, $values); if ($updated) { return Rs::success(); } return Rs::error('操作失败'); } /** * 保存子类 */ public function saveSubClass(Request $request) { $data = $request->validate([ 'id' => 'required|integer', 'code' => 'sometimes|string|max:50', 'name' => 'required|string|max:255', 'pid' => 'required|integer', 'status' => 'required|integer|in:0,1', ]); $conditions = ['id' => $data['id']]; $values = [ 'code' => $data['code'] ?? '', 'name' => $data['name'], 'pid' => $data['pid'], 'status' => $data['status'], ]; $updated = DB::table('exam_item_class')->updateOrInsert($conditions, $values); if ($updated) { return Rs::success(); } return Rs::error('操作失败'); } /** * 保存项目 */ public function saveItem(Request $request) { $data = $request->validate([ 'id' => 'required|integer', 'big_class_id' => 'sometimes|integer', 'class_id' => 'required|integer', 'code' => 'sometimes|string|max:50', 'name' => 'required|string|max:100', 'desc' => 'sometimes|string|max:255', 'need_appointment' => 'sometimes|integer|in:0,1', 'exam_part_code' => 'sometimes|string|max:50', 'fasting_status' => 'sometimes|integer|in:0,1', 'check_tips' => 'sometimes|string', 'check_time' => 'sometimes|integer', 'use_seats' => 'sometimes|integer', 'enable_channel_mask' => 'sometimes|integer', 'status' => 'required|integer|in:0,1', ]); $conditions = ['id' => $data['id']]; $values = [ 'class_id' => $data['class_id'], 'code' => $data['code'] ?? '', 'name' => $data['name'], 'desc' => $data['desc'] ?? '', 'need_appointment' => $data['need_appointment'] ?? 1, 'exam_part_code' => $data['exam_part_code'] ?? '', 'fasting_status' => $data['fasting_status'] ?? 0, 'check_tips' => $data['check_tips'] ?? '', 'check_time' => $data['check_time'] ?? null, 'use_seats' => $data['use_seats'] ?? 1, 'enable_channel_mask' => $data['enable_channel_mask'] ?? 0, 'status' => $data['status'], ]; $updated = DB::table('exam_item')->updateOrInsert($conditions, $values); if ($updated) { return Rs::success(); } return Rs::error('操作失败'); } /** * 删除大类 */ public function deleteBigClass(Request $request) { $data = $request->validate([ 'id' => 'required|integer', ]); // 检查是否有子类 $hasSubClass = DB::table('exam_item_class') ->where('pid', $data['id']) ->where('deleted', 0) ->exists(); if ($hasSubClass) { return Rs::error('该大类下存在子类,无法删除'); } $deleted = DB::table('exam_item_class')->where('id', $data['id'])->update(['deleted' => 1]); if ($deleted) { return Rs::success(); } return Rs::error('删除失败'); } /** * 删除子类 */ public function deleteSubClass(Request $request) { $data = $request->validate([ 'id' => 'required|integer', ]); // 检查是否有项目 $hasItem = DB::table('exam_item') ->where('class_id', $data['id']) ->where('deleted', 0) ->exists(); if ($hasItem) { return Rs::error('该子类下存在项目,无法删除'); } $deleted = DB::table('exam_item_class')->where('id', $data['id'])->update(['deleted' => 1]); if ($deleted) { return Rs::success(); } return Rs::error('删除失败'); } /** * 删除项目 */ public function deleteItem(Request $request) { $data = $request->validate([ 'id' => 'required|integer', ]); $deleted = DB::table('exam_item')->where('id', $data['id'])->update(['deleted' => 1]); if ($deleted) { return Rs::success(); } return Rs::error('删除失败'); } /** * 获取所有大类(用于下拉选择) */ public function getAllBigClasses() { $list = DB::table('exam_item_class') ->where('deleted', 0) ->where(function($q) { $q->where('pid', 0)->orWhereNull('pid'); }) ->where('status', 1) ->orderBy('id', 'asc') ->get(); return Rs::success($list); } /** * 获取渠道列表(用于多选) */ public function getChannelList() { $list = DB::table('channel') ->where('status', 1) ->orderBy('id', 'asc') ->get(); return Rs::success($list); } /** * 获取分组列表 */ public function getGroupList(Request $request) { $name = $request->input('name', ''); $code = $request->input('code', ''); $page = $request->input('page', 1); $pageSize = $request->input('page_size', 10); $query = DB::table('exam_group as eg') ->leftJoin('exam_group_item as egi', 'eg.id', '=', 'egi.group_id') ->select( 'eg.*', DB::raw('COUNT(DISTINCT egi.item_id) as item_count') ) ->groupBy('eg.id'); if (!empty($name)) { $query->where('eg.name', 'like', '%' . $name . '%'); } if (!empty($code)) { $query->where('eg.code', 'like', '%' . $code . '%'); } $total = $query->get()->count(); $list = $query->orderBy('eg.id', 'desc') ->skip(($page - 1) * $pageSize) ->take($pageSize) ->get(); return Rs::success([ 'list' => $list, 'total' => $total, 'page' => $page, 'page_size' => $pageSize, 'total_pages' => ceil($total / $pageSize) ]); } /** * 保存分组 */ public function saveGroup(Request $request) { $data = $request->validate([ 'id' => 'required|integer', 'name' => 'required|string|max:50', 'code' => 'sometimes|string|max:50', ]); $conditions = ['id' => $data['id']]; $values = [ 'name' => $data['name'], 'code' => $data['code'] ?? '', ]; DB::table('exam_group')->updateOrInsert($conditions, $values); return Rs::success(); } /** * 删除分组 */ public function deleteGroup(Request $request) { $data = $request->validate([ 'id' => 'required|integer', ]); $deleted = DB::table('exam_group')->where('id', $data['id'])->delete(); if ($deleted) { return Rs::success(); } return Rs::error('删除失败'); } /** * 获取分组内的项目列表 */ public function getGroupItemList(Request $request) { $data = $request->validate([ 'group_id' => 'required|integer', ]); $list = DB::table('exam_item as ei') ->join('exam_group_item as egi', 'ei.id', '=', 'egi.item_id') ->leftJoin('exam_item_class as sub_class', 'ei.class_id', '=', 'sub_class.id') ->leftJoin('exam_item_class as big_class', 'sub_class.pid', '=', 'big_class.id') ->where('egi.group_id', $data['group_id']) ->where('ei.deleted', 0) ->select( 'ei.*', 'big_class.id as big_class_id', 'big_class.name as big_class_name', 'sub_class.name as sub_class_name' ) ->orderBy('ei.id', 'asc') ->get(); return Rs::success($list); } /** * 添加项目到分组 */ public function addItemToGroup(Request $request) { $data = $request->validate([ 'group_id' => 'required|integer', 'item_id' => 'required|integer', ]); $exists = DB::table('exam_group_item') ->where('group_id', $data['group_id']) ->where('item_id', $data['item_id']) ->exists(); if ($exists) { return Rs::error('该项目已存在于分组中'); } DB::table('exam_group_item')->insert([ 'group_id' => $data['group_id'], 'item_id' => $data['item_id'], 'created_at' => now(), 'updated_at' => now(), ]); return Rs::success(); } /** * 从分组移除项目 */ public function removeItemFromGroup(Request $request) { $data = $request->validate([ 'group_id' => 'required|integer', 'item_id' => 'required|integer', ]); $deleted = DB::table('exam_group_item') ->where('group_id', $data['group_id']) ->where('item_id', $data['item_id']) ->delete(); if ($deleted) { return Rs::success(); } return Rs::error('移除失败'); } /** * 获取项目的资源配置列表 */ public function getItemResourceList(Request $request) { $data = $request->validate([ 'item_id' => 'required|integer', ]); $list = DB::table('exam_item_resource as eir') ->join('department_resource as dr', 'eir.resource_id', '=', 'dr.id') ->leftJoin('department as d', 'dr.department_id', '=', 'd.id') ->where('eir.item_id', $data['item_id']) ->where('eir.deleted', 0) ->select( 'dr.id', 'dr.name', 'dr.code', 'dr.department_id', 'd.name as department_name', 'dr.status' ) ->orderBy('eir.id', 'asc') ->get(); return Rs::success([ 'list' => $list ]); } /** * 添加资源到项目 */ public function addItemResources(Request $request) { $data = $request->validate([ 'item_id' => 'required|integer', 'resource_ids' => 'required|array', 'resource_ids.*' => 'integer', ]); $item_id = $data['item_id']; $resource_ids = $data['resource_ids']; $insertData = []; foreach ($resource_ids as $resource_id) { $exists = DB::table('exam_item_resource') ->where('item_id', $item_id) ->where('resource_id', $resource_id) ->where('deleted', 0) ->exists(); if (!$exists) { $insertData[] = [ 'item_id' => $item_id, 'resource_id' => $resource_id, 'deleted' => 0, 'created_at' => now(), 'updated_at' => now() ]; } } if (!empty($insertData)) { DB::table('exam_item_resource')->insert($insertData); } return Rs::success(); } /** * 从项目移除资源 */ public function removeItemResource(Request $request) { $data = $request->validate([ 'item_id' => 'required|integer', 'resource_id' => 'required|integer', ]); $deleted = DB::table('exam_item_resource') ->where('item_id', $data['item_id']) ->where('resource_id', $data['resource_id']) ->update(['deleted' => 1]); if ($deleted) { return Rs::success(); } return Rs::error('移除失败'); } /** * 获取检查组列表 */ public function getExamGroupList(Request $request) { $page = $request->input('page', 1); $pageSize = $request->input('page_size', 10); $name = $request->input('name', ''); $query = DB::table('exam_group'); if (!empty($name)) { $query->where('name', 'like', '%' . $name . '%'); } $total = $query->count(); $list = $query->orderBy('id', 'asc') ->skip(($page - 1) * $pageSize) ->take($pageSize) ->get(); return Rs::success([ 'list' => $list, 'total' => $total, 'page' => $page, 'page_size' => $pageSize, 'total_pages' => ceil($total / $pageSize) ]); } /** * 获取项目关联的部位列表 */ public function getItemBodyParts(Request $request) { $data = $request->validate([ 'item_id' => 'required|integer', ]); $list = DB::table('exam_item_body_part as eibp') ->join('exam_body_part as ebp', 'eibp.body_part_id', '=', 'ebp.id') ->where('eibp.item_id', $data['item_id']) ->where('ebp.deleted', 0) ->select('ebp.id', 'ebp.code', 'ebp.name', 'ebp.parent_id') ->orderBy('ebp.sort_order', 'asc') ->get(); return Rs::success($list); } /** * 保存项目关联的部位(全量覆盖) */ public function saveItemBodyParts(Request $request) { $data = $request->validate([ 'item_id' => 'required|integer', 'body_part_ids' => 'required|array', 'body_part_ids.*' => 'integer', ]); $itemId = $data['item_id']; $bodyPartIds = $data['body_part_ids']; // 先删除旧关联 DB::table('exam_item_body_part')->where('item_id', $itemId)->delete(); // 插入新关联 if (!empty($bodyPartIds)) { $insertData = []; foreach ($bodyPartIds as $partId) { $insertData[] = [ 'item_id' => $itemId, 'body_part_id' => $partId, 'created_at' => now(), ]; } DB::table('exam_item_body_part')->insert($insertData); } return Rs::success(); } }