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.

721 lines
20 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace App\Http\Controllers\API\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Lib\Rs;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
class ExamItemController extends Controller
{
/**
* 获取大类列表exam_item_class表中pid=0或pid为null
*/
public function getBigClassList(Request $request)
{
$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(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();
}
}