需求优化

1. 管理员显示肛肠二科病区,去掉
2. 检查项目列表增加项目代码列,搜索筛选条件增加代码/名称模糊搜索
3. 检查项目增加筛选条件:是否关联了检查室
4. 检查项目需要增加代码/名称列表排序功能
5. 服务组隐藏掉,关联服务组改成关联检查室
6. 主工作列表日期范围选择功能优化
main
鹿和sa0ChunLuyu 3 weeks ago
parent d39bbdc415
commit 28b967f952

@ -18,9 +18,8 @@ public function GetClassList($searchInfo){
} }
//获取检查项目列表 //获取检查项目列表
public function GetItemList($searchInfo,$page,$pageSize){ public function GetItemList($searchInfo,$page,$pageSize){
$where=['s_check_item.is_del'=>0];
$small_id=[]; $small_id=[];
$list=DB::table('s_check_item'); $list=DB::table('s_check_item')->where('s_check_item.is_del', 0)->whereNotNull('sheetType')->where('sheetType', '!=', '');
if(empty($searchInfo['bigClass'])!==true and empty($searchInfo['smallClass'])===true){ if(empty($searchInfo['bigClass'])!==true and empty($searchInfo['smallClass'])===true){
$small_id= DB::table('s_check_item_class')->where(['pid'=>$searchInfo['bigClass'],'is_del'=>0])->pluck('id')->toArray(); $small_id= DB::table('s_check_item_class')->where(['pid'=>$searchInfo['bigClass'],'is_del'=>0])->pluck('id')->toArray();
$list= $list->whereIn('item_class_id',$small_id); $list= $list->whereIn('item_class_id',$small_id);
@ -30,14 +29,31 @@ public function GetItemList($searchInfo,$page,$pageSize){
$list= $list->whereIn('item_class_id',$small_id); $list= $list->whereIn('item_class_id',$small_id);
} }
if(!empty($searchInfo['name'])){ if(!empty($searchInfo['name'])){
$where[]=['item_name','like','%'.$searchInfo['name'].'%']; $list->where(function($query) use ($searchInfo) {
$query->where('item_name', 'like', '%'.$searchInfo['name'].'%')
->orWhere('item_code', 'like', '%'.$searchInfo['name'].'%');
});
} }
$count= $list->where($where)->count(); if (isset($searchInfo['deviceBind']) && $searchInfo['deviceBind'] !== '') {
if ($searchInfo['deviceBind'] == 1) {
$list->whereIn('s_check_item.id', function($q) {
$q->select('item_id')->from('s_check_item_device');
});
} elseif ($searchInfo['deviceBind'] == 0) {
$list->whereNotIn('s_check_item.id', function($q) {
$q->select('item_id')->from('s_check_item_device');
});
}
}
$count = $list->count();
$list= $list $list= $list
->leftJoin('s_appointment_type', 's_check_item.reservation_method', '=', 's_appointment_type.id') ->leftJoin('s_appointment_type', 's_check_item.reservation_method', '=', 's_appointment_type.id')
->select('s_check_item.*','s_appointment_type.name as reservation_method_name') ->select('s_check_item.*','s_appointment_type.name as reservation_method_name');
->where($where)->skip(($page-1)*$pageSize) // 跳过前9999条记录 if (!empty($searchInfo['orderField']) && !empty($searchInfo['orderDirection'])) {
->take($pageSize)->get(); $direction = $searchInfo['orderDirection'] == 'ascending' ? 'asc' : 'desc';
$list->orderBy($searchInfo['orderField'], $direction);
}
$list = $list->skip(($page-1)*$pageSize)->take($pageSize)->get();
//查询出所有的预约渠道 //查询出所有的预约渠道
$qudaoList=DB::table('s_appointment_type')->get(); $qudaoList=DB::table('s_appointment_type')->get();
foreach ($list as $k=>$v){ foreach ($list as $k=>$v){

@ -5,7 +5,7 @@ class DepartmentResourceService
{ {
public function Save($info,$userid) public function Save($info,$userid)
{ {
$id = $info['id']; $id = $info['id'] ?? null;
$department_id = $info['department_id']; $department_id = $info['department_id'];
//查询科室状态是否正常 //查询科室状态是否正常
$department = DB::table('s_department') $department = DB::table('s_department')
@ -16,21 +16,70 @@ public function Save($info,$userid)
if(!$department) { if(!$department) {
return \Yz::Return(false, '科室状态异常', []); return \Yz::Return(false, '科室状态异常', []);
} }
if(isset($id)) {
$c = DB::table('s_department_resources') DB::beginTransaction();
->where('id', $id) try {
->update($info); if(isset($id)) {
}else { // 修改诊室
$info['is_del']=0; $c = DB::table('s_department_resources')
$info['adduser']=$userid; ->where('id', $id)
$info['time_range'] = json_encode($info['time_range']); ->update($info);
$c = DB::table('s_department_resources')
->insert($info); // 检查是否已关联服务组
} $bind = DB::table('s_department_resources_device')
if(!$c) { ->where('rsourece_id', $id)
return \Yz::Return(false, '保存失败', []); ->first();
}else{
if($bind) {
// 已关联 → 同步更新设备名称
DB::table('s_devices')
->where('id', $bind->device_id)
->update(['device_name' => $info['department_resources_name']]);
} else {
// 未关联 → 新建设备并建立关联
$deviceId = DB::table('s_devices')->insertGetId([
'device_name' => $info['department_resources_name'],
'status' => 1,
'adduser' => $userid,
'is_del' => 0,
]);
DB::table('s_department_resources_device')->insert([
'department_id' => $department_id,
'rsourece_id' => $id,
'device_id' => $deviceId,
]);
}
} else {
// 新增诊室
$info['is_del'] = 0;
$info['adduser'] = $userid;
$info['time_range'] = json_encode($info['time_range']);
$resourceId = DB::table('s_department_resources')->insertGetId($info);
if(!$resourceId) {
DB::rollBack();
return \Yz::Return(false, '保存失败', []);
}
// 新建设备并建立关联
$deviceId = DB::table('s_devices')->insertGetId([
'device_name' => $info['department_resources_name'],
'status' => 1,
'adduser' => $userid,
'is_del' => 0,
]);
DB::table('s_department_resources_device')->insert([
'department_id' => $department_id,
'rsourece_id' => $resourceId,
'device_id' => $deviceId,
]);
}
DB::commit();
return \Yz::Return(true, '保存成功', []); return \Yz::Return(true, '保存成功', []);
} catch (\Exception $e) {
DB::rollBack();
return \Yz::Return(false, '保存失败:' . $e->getMessage());
} }
} }
public function GetList($searchInfo,$page,$pageSize){ public function GetList($searchInfo,$page,$pageSize){
@ -50,10 +99,6 @@ public function GetList($searchInfo,$page,$pageSize){
->take($pageSize)->get() ; ->take($pageSize)->get() ;
foreach ($list as $k=>$v){ foreach ($list as $k=>$v){
$list[$k]->time_range=json_decode($v->time_range,true); $list[$k]->time_range=json_decode($v->time_range,true);
$list[$k]->devicesInfo=DB::table('s_department_resources_device')
->join('s_devices', 's_department_resources_device.device_id', '=', 's_devices.id')
->select('s_devices.*')
->where('rsourece_id',$v->id)->get();
} }
return \Yz::Return(true, '查询成功', ['list'=>$list,'count'=>$c]); return \Yz::Return(true, '查询成功', ['list'=>$list,'count'=>$c]);
} }

@ -33,7 +33,7 @@
<el-avatar :size="40" :src="BaseUserInfo.img" /> <el-avatar :size="40" :src="BaseUserInfo.img" />
</div> </div>
<div v-if="BaseUserInfo.cn_name"> <div v-if="BaseUserInfo.cn_name">
<el-dropdown @command="DepartmentHandleCommand"> <el-dropdown v-if="BaseUserInfo.department_id && BaseUserInfo.department_info?.length > 1" @command="DepartmentHandleCommand">
<span class="el-dropdown-link"> <span class="el-dropdown-link">
{{BaseUserInfo.department_name}} {{BaseUserInfo.department_name}}
<el-icon class="el-icon--right"> <el-icon class="el-icon--right">
@ -50,6 +50,10 @@
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
<div v-else-if="BaseUserInfo.department_id && BaseUserInfo.department_info?.length === 1"
style="font-size: 14px; margin-bottom: 4px; text-align: center;">
{{BaseUserInfo.department_info[0].department_name}}
</div>
<el-popover placement="bottom" :width="150" trigger="hover"> <el-popover placement="bottom" :width="150" trigger="hover">
<template #reference> <template #reference>
<div style="font-size: 14px;">{{BaseUserInfo.cn_name}}</div> <div style="font-size: 14px;">{{BaseUserInfo.cn_name}}</div>

@ -2,32 +2,38 @@
<div v-loading="loading"> <div v-loading="loading">
<div class="head"> <div class="head">
<el-row> <el-row>
<el-form-item> <div style="display: inline-flex; align-items: center;">
<el-tag class="ml-2" type="success" style="margin-right: 20px;">医嘱类别</el-tag> <el-tag class="ml-2" type="success" style="margin-right: 20px;">医嘱类别</el-tag>
<el-select clearable :filterable="true" v-model="searchInfo.bigClass" @change="GetItemClassList()" <el-select clearable :filterable="true" v-model="searchInfo.bigClass" @change="GetItemClassList()"
placeholder="所有医嘱大类"> placeholder="所有医嘱大类">
<el-option v-for="(item, index) in BigClassList" :key="index" :label="item.item_class_name" <el-option v-for="(item, index) in BigClassList" :key="index" :label="item.item_class_name"
:value="item.id" /> :value="item.id" />
</el-select> </el-select>
</el-form-item>
<el-form-item>
<el-select :filterable="true" clearable v-model="searchInfo.smallClass" placeholder="所有医嘱小类" <el-select :filterable="true" clearable v-model="searchInfo.smallClass" placeholder="所有医嘱小类"
style="margin-left: 10px;"> style="margin-left: 10px;">
<el-option v-for="(item, index) in SmallClassList" :key="index" :label="item.item_class_name" <el-option v-for="(item, index) in SmallClassList" :key="index" :label="item.item_class_name"
:value="item.id" /> :value="item.id" />
</el-select> </el-select>
</el-form-item>
<el-form-item> <el-select clearable v-model="searchInfo.deviceBind" placeholder="关联检查室" style="margin-left: 10px;">
<el-input v-model="searchInfo.name" placeholder="请输入检查项目名称" style="margin-left: 10px;" /> <el-option label="全部" value="" />
</el-form-item> <el-option label="已关联检查室" :value="1" />
<el-option label="未关联检查室" :value="0" />
</el-select>
<el-input v-model="searchInfo.name" placeholder="请输入项目编号/名称" style="margin-left: 10px;" />
</div>
<el-button type="primary" @click="GetItemList()" style="margin-left: 10px;">查询</el-button> <el-button type="primary" @click="GetItemList()" style="margin-left: 10px;">查询</el-button>
<el-button type="warning" @click="GetHisItemClass()" style="margin-left: 10px; margin-left: 40px;">同步分类</el-button> <el-button type="warning" @click="GetHisItemClass()" style="margin-left: 10px; margin-left: 40px;">同步分类</el-button>
<el-button type="warning" @click="GetHisCheckItem()" style="margin-left: 10px;">同步检查项目</el-button> <el-button type="warning" @click="GetHisCheckItem()" style="margin-left: 10px;">同步检查项目</el-button>
<el-button type="primary" @click="BatchLinkDevice()" style="margin-left: 10px;">批量关联检查室</el-button>
</el-row> </el-row>
</div> </div>
<el-table :data="tableData" style="width: 100%;" row-key="id"> <el-table ref="checkItemTableRef" :data="tableData" style="width: 100%; margin-top: 10px;" row-key="id" @sort-change="onSortChange" @selection-change="onSelectionChange">
<el-table-column prop="id" label="Id" width="100" v-if="false" /> <el-table-column type="selection" width="50" />
<el-table-column prop="item_name" label="检查项目名称" /> <el-table-column prop="item_code" label="检查项目编号" width="160" sortable="custom" />
<el-table-column prop="item_name" label="检查项目名称" sortable="custom" />
<el-table-column prop="reservation_method_name" label="预约方式" /> <el-table-column prop="reservation_method_name" label="预约方式" />
<el-table-column prop="limosis" label="要求空腹" width="100"> <el-table-column prop="limosis" label="要求空腹" width="100">
<template #default="scope"> <template #default="scope">
@ -38,7 +44,7 @@
<el-table-column prop="check_notice" label="检查须知" /> <el-table-column prop="check_notice" label="检查须知" />
<el-table-column prop="check_time" label="检查时间" width="100" /> <el-table-column prop="check_time" label="检查时间" width="100" />
<el-table-column prop="check_begin_time" label="开始预约时间" width="120" /> <el-table-column prop="check_begin_time" label="开始预约时间" width="120" />
<el-table-column prop="devicesInfo" label="关联服务组"> <el-table-column prop="devicesInfo" label="关联检查室">
<template #default="scope"> <template #default="scope">
<span v-for="(item,index) in scope.row.devicesInfo " :key="index"> <span v-for="(item,index) in scope.row.devicesInfo " :key="index">
<el-tag v-if="item.status==1 && item.is_del==0" class="ml-2" <el-tag v-if="item.status==1 && item.is_del==0" class="ml-2"
@ -48,9 +54,9 @@
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="" label="医嘱关联服务组" width="150"> <el-table-column prop="" label="医嘱关联检查室" width="150">
<template #default="scope"> <template #default="scope">
<el-button size="small" @click="LinkDeviceClick(scope.row)"></el-button> <el-button size="small" @click="LinkDeviceClick(scope.row)"></el-button>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="" label="操作" width="220"> <el-table-column prop="" label="操作" width="220">
@ -67,11 +73,14 @@
@size-change="PageSizeChange" @current-change="PageCurrentChange" /> @size-change="PageSizeChange" @current-change="PageCurrentChange" />
</div> </div>
<el-dialog v-model="DevicedialogVisible" title="关联服务组" width="40%"> <el-dialog v-model="DevicedialogVisible" :title="linkDialogTitle" width="40%">
<div class="chuansuokuang"> <div class="chuansuokuang">
<el-transfer v-model="selectedDevice" :titles="['可选服务组', '已关联服务组']" <el-transfer v-model="selectedDevice" :titles="['可选检查室', '已关联检查室']"
:props="{ key: 'id',label: 'device_name'}" :data="deviceList" /> :props="{ key: 'id',label: 'device_name'}" :data="deviceList" />
</div> </div>
<div v-if="isBatchLink && batchProgressShow" style="padding: 0 20px 12px; margin-top: 10px;">
<el-progress :percentage="batchProgress" :stroke-width="14" />
</div>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="DevicedialogVisible = false">取消</el-button> <el-button @click="DevicedialogVisible = false">取消</el-button>
@ -258,6 +267,7 @@
<script setup> <script setup>
import { import {
ref, ref,
computed,
onMounted onMounted
} from 'vue' } from 'vue'
import { import {
@ -288,7 +298,8 @@
bigClass: '', bigClass: '',
smallClass: '', smallClass: '',
name: '', name: '',
orderField: '',
orderDirection: ''
}) })
// //
let selectedItemInfo = ref({ let selectedItemInfo = ref({
@ -339,6 +350,11 @@
let pageSize = ref(15) // let pageSize = ref(15) //
let total = 0 // let total = 0 //
const GetItemList = () => { const GetItemList = () => {
//
if (checkItemTableRef.value) {
checkItemTableRef.value.clearSelection()
}
selectedCheckItems.value = []
loading.value = true loading.value = true
GetCheckItemList({ GetCheckItemList({
searchInfo: searchInfo.value, searchInfo: searchInfo.value,
@ -361,6 +377,11 @@
}) })
} }
const onSortChange = ({ prop, order }) => {
searchInfo.value.orderField = prop || ''
searchInfo.value.orderDirection = order || ''
GetItemList()
}
const PageSizeChange = (e) => { // const PageSizeChange = (e) => { //
pageSize.value = e pageSize.value = e
GetItemList() GetItemList()
@ -372,9 +393,23 @@
let DevicedialogVisible = ref(false); // let DevicedialogVisible = ref(false); //
let ItemDialogVisible = ref(false); // let ItemDialogVisible = ref(false); //
let isBatchLink = ref(false) //
let selectedCheckItems = ref([]) //
let checkItemTableRef = ref(null) //ref
//
const linkDialogTitle = computed(() => {
return isBatchLink.value ? '批量关联检查室' : '关联检查室'
})
//
const onSelectionChange = (rows) => {
selectedCheckItems.value = rows
}
//穿 //穿
const LinkDeviceClick = (row) => { const LinkDeviceClick = (row) => {
isBatchLink.value = false
selectedDevice.value = [] selectedDevice.value = []
DevicedialogVisible.value = true DevicedialogVisible.value = true
selectedItemInfo.value.id = row.id selectedItemInfo.value.id = row.id
@ -388,20 +423,84 @@
}) })
} }
//
const BatchLinkDevice = () => {
if (selectedCheckItems.value.length === 0) {
ElMessage.error('请先勾选要批量关联的检查项目')
return
}
isBatchLink.value = true
//
let common = []
if (selectedCheckItems.value.length > 0) {
common = selectedCheckItems.value[0].devicesInfo.map(d => d.id)
for (let i = 1; i < selectedCheckItems.value.length; i++) {
const ids = selectedCheckItems.value[i].devicesInfo.map(d => d.id)
common = common.filter(id => ids.includes(id))
}
}
selectedDevice.value = common
DevicedialogVisible.value = true
}
let selectedDevice = ref([]) // let selectedDevice = ref([]) //
const SaveLinkDevice = () => { let batchProgress = ref(0) //
ItemBindDevice({ let batchProgressShow = ref(false) //
item_id: selectedItemInfo.value.id, const SaveLinkDevice = async () => {
device_ids: selectedDevice.value, const saveOne = (itemId) => {
}).then(res => { return ItemBindDevice({
if (res.status) { item_id: itemId,
DevicedialogVisible.value = false device_ids: selectedDevice.value,
selectedDevice.value = [] })
GetItemClassList() }
if (isBatchLink.value) {
//
batchProgressShow.value = true
batchProgress.value = 0
const total = selectedCheckItems.value.length
let successCount = 0
let failCount = 0
for (let i = 0; i < total; i++) {
try {
const res = await saveOne(selectedCheckItems.value[i].id)
if (res.status) {
successCount++
} else {
failCount++
}
} catch {
failCount++
}
batchProgress.value = Math.round(((i + 1) / total) * 100)
}
setTimeout(() => {
batchProgressShow.value = false
}, 1500)
if (failCount === 0) {
ElMessage.success(`批量关联成功,共${total}`)
} else { } else {
ElMessage.error(res.msg) ElMessage.warning(`完成${successCount}项,失败${failCount}`)
} }
})
DevicedialogVisible.value = false
selectedDevice.value = []
GetItemClassList()
} else {
//
saveOne(selectedItemInfo.value.id).then(res => {
if (res.status) {
DevicedialogVisible.value = false
selectedDevice.value = []
GetItemClassList()
} else {
ElMessage.error(res.msg)
}
})
}
} }
// //
let deviceList = ref([]) let deviceList = ref([])

@ -53,20 +53,7 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="" label="关联服务组" width="150">
<template #default="scope">
<div style="text-align: center;" >
<el-button size="small" @click="LinkDeviceClick(scope.row)"></el-button>
<el-tooltip effect="dark" placement="bottom">
<template #content>
<div v-for="(item,index) in scope.row.devicesInfo">{{index+1}}. {{item.device_name}}</div>
</template>
<div style="color: #00aaff; font-size: 12px; cursor: pointer; ">
已关联{{scope.row.devicesInfo.length}}</div>
</el-tooltip>
</div>
</template>
</el-table-column>
<el-table-column prop="" label="操作" width="180"> <el-table-column prop="" label="操作" width="180">
<template #default="scope"> <template #default="scope">
<el-button type="primary" @click="Edit(scope.row)" size="small">修改</el-button> <el-button type="primary" @click="Edit(scope.row)" size="small">修改</el-button>

@ -9,9 +9,11 @@
<div class="head"> <div class="head">
<el-row> <el-row>
<el-form-item> <el-form-item>
<el-date-picker style="margin-left: 8px; width: 300px" v-model="searchInfo.dateRange" <el-date-picker style="margin-left: 8px; width: 150px" v-model="searchInfo.dateRange[0]"
type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" type="date" placeholder="开始时间" value-format="YYYY-MM-DD" />
value-format="YYYY-MM-DD" /> <span style="margin: 0 4px;"></span>
<el-date-picker style="width: 150px" v-model="searchInfo.dateRange[1]"
type="date" placeholder="结束时间" value-format="YYYY-MM-DD" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-select :filterable="true" clearable v-model="searchInfo.list_status" placeholder="状态" <el-select :filterable="true" clearable v-model="searchInfo.list_status" placeholder="状态"

Loading…
Cancel
Save