|
|
|
|
@ -2,32 +2,38 @@
|
|
|
|
|
<div v-loading="loading">
|
|
|
|
|
<div class="head">
|
|
|
|
|
<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-select clearable :filterable="true" v-model="searchInfo.bigClass" @change="GetItemClassList()"
|
|
|
|
|
placeholder="所有医嘱大类">
|
|
|
|
|
<el-option v-for="(item, index) in BigClassList" :key="index" :label="item.item_class_name"
|
|
|
|
|
:value="item.id" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item>
|
|
|
|
|
|
|
|
|
|
<el-select :filterable="true" clearable v-model="searchInfo.smallClass" placeholder="所有医嘱小类"
|
|
|
|
|
style="margin-left: 10px;">
|
|
|
|
|
<el-option v-for="(item, index) in SmallClassList" :key="index" :label="item.item_class_name"
|
|
|
|
|
:value="item.id" />
|
|
|
|
|
</el-select>
|
|
|
|
|
</el-form-item>
|
|
|
|
|
<el-form-item>
|
|
|
|
|
<el-input v-model="searchInfo.name" placeholder="请输入检查项目名称" style="margin-left: 10px;" />
|
|
|
|
|
</el-form-item>
|
|
|
|
|
|
|
|
|
|
<el-select clearable v-model="searchInfo.deviceBind" placeholder="关联检查室" style="margin-left: 10px;">
|
|
|
|
|
<el-option label="全部" value="" />
|
|
|
|
|
<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="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="primary" @click="BatchLinkDevice()" style="margin-left: 10px;">批量关联检查室</el-button>
|
|
|
|
|
</el-row>
|
|
|
|
|
</div>
|
|
|
|
|
<el-table :data="tableData" style="width: 100%;" row-key="id">
|
|
|
|
|
<el-table-column prop="id" label="Id" width="100" v-if="false" />
|
|
|
|
|
<el-table-column prop="item_name" label="检查项目名称" />
|
|
|
|
|
<el-table ref="checkItemTableRef" :data="tableData" style="width: 100%; margin-top: 10px;" row-key="id" @sort-change="onSortChange" @selection-change="onSelectionChange">
|
|
|
|
|
<el-table-column type="selection" width="50" />
|
|
|
|
|
<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="limosis" label="要求空腹" width="100">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
@ -38,7 +44,7 @@
|
|
|
|
|
<el-table-column prop="check_notice" label="检查须知" />
|
|
|
|
|
<el-table-column prop="check_time" label="检查时间" width="100" />
|
|
|
|
|
<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">
|
|
|
|
|
<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"
|
|
|
|
|
@ -48,9 +54,9 @@
|
|
|
|
|
</span>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column prop="" label="医嘱关联服务组" width="150">
|
|
|
|
|
<el-table-column prop="" label="医嘱关联检查室" width="150">
|
|
|
|
|
<template #default="scope">
|
|
|
|
|
<el-button size="small" @click="LinkDeviceClick(scope.row)">关联服务组</el-button>
|
|
|
|
|
<el-button size="small" @click="LinkDeviceClick(scope.row)">关联检查室</el-button>
|
|
|
|
|
</template>
|
|
|
|
|
</el-table-column>
|
|
|
|
|
<el-table-column prop="" label="操作" width="220">
|
|
|
|
|
@ -67,11 +73,14 @@
|
|
|
|
|
@size-change="PageSizeChange" @current-change="PageCurrentChange" />
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<el-dialog v-model="DevicedialogVisible" title="关联服务组" width="40%">
|
|
|
|
|
<el-dialog v-model="DevicedialogVisible" :title="linkDialogTitle" width="40%">
|
|
|
|
|
<div class="chuansuokuang">
|
|
|
|
|
<el-transfer v-model="selectedDevice" :titles="['可选服务组', '已关联服务组']"
|
|
|
|
|
<el-transfer v-model="selectedDevice" :titles="['可选检查室', '已关联检查室']"
|
|
|
|
|
:props="{ key: 'id',label: 'device_name'}" :data="deviceList" />
|
|
|
|
|
</div>
|
|
|
|
|
<div v-if="isBatchLink && batchProgressShow" style="padding: 0 20px 12px; margin-top: 10px;">
|
|
|
|
|
<el-progress :percentage="batchProgress" :stroke-width="14" />
|
|
|
|
|
</div>
|
|
|
|
|
<template #footer>
|
|
|
|
|
<span class="dialog-footer">
|
|
|
|
|
<el-button @click="DevicedialogVisible = false">取消</el-button>
|
|
|
|
|
@ -258,6 +267,7 @@
|
|
|
|
|
<script setup>
|
|
|
|
|
import {
|
|
|
|
|
ref,
|
|
|
|
|
computed,
|
|
|
|
|
onMounted
|
|
|
|
|
} from 'vue'
|
|
|
|
|
import {
|
|
|
|
|
@ -288,7 +298,8 @@
|
|
|
|
|
bigClass: '',
|
|
|
|
|
smallClass: '',
|
|
|
|
|
name: '',
|
|
|
|
|
|
|
|
|
|
orderField: '',
|
|
|
|
|
orderDirection: ''
|
|
|
|
|
})
|
|
|
|
|
//选中的项目信息
|
|
|
|
|
let selectedItemInfo = ref({
|
|
|
|
|
@ -339,6 +350,11 @@
|
|
|
|
|
let pageSize = ref(15) //每页数量
|
|
|
|
|
let total = 0 //总数量
|
|
|
|
|
const GetItemList = () => {
|
|
|
|
|
// 清空勾选
|
|
|
|
|
if (checkItemTableRef.value) {
|
|
|
|
|
checkItemTableRef.value.clearSelection()
|
|
|
|
|
}
|
|
|
|
|
selectedCheckItems.value = []
|
|
|
|
|
loading.value = true
|
|
|
|
|
GetCheckItemList({
|
|
|
|
|
searchInfo: searchInfo.value,
|
|
|
|
|
@ -361,6 +377,11 @@
|
|
|
|
|
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
const onSortChange = ({ prop, order }) => {
|
|
|
|
|
searchInfo.value.orderField = prop || ''
|
|
|
|
|
searchInfo.value.orderDirection = order || ''
|
|
|
|
|
GetItemList()
|
|
|
|
|
}
|
|
|
|
|
const PageSizeChange = (e) => { // 修改每页数量
|
|
|
|
|
pageSize.value = e
|
|
|
|
|
GetItemList()
|
|
|
|
|
@ -372,9 +393,23 @@
|
|
|
|
|
|
|
|
|
|
let DevicedialogVisible = 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) => {
|
|
|
|
|
isBatchLink.value = false
|
|
|
|
|
selectedDevice.value = []
|
|
|
|
|
DevicedialogVisible.value = true
|
|
|
|
|
selectedItemInfo.value.id = row.id
|
|
|
|
|
@ -388,12 +423,75 @@
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 批量关联检查室
|
|
|
|
|
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([]) //选中的设备
|
|
|
|
|
const SaveLinkDevice = () => {
|
|
|
|
|
ItemBindDevice({
|
|
|
|
|
item_id: selectedItemInfo.value.id,
|
|
|
|
|
let batchProgress = ref(0) //批量关联进度
|
|
|
|
|
let batchProgressShow = ref(false) //是否显示进度条
|
|
|
|
|
const SaveLinkDevice = async () => {
|
|
|
|
|
const saveOne = (itemId) => {
|
|
|
|
|
return ItemBindDevice({
|
|
|
|
|
item_id: itemId,
|
|
|
|
|
device_ids: selectedDevice.value,
|
|
|
|
|
}).then(res => {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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 {
|
|
|
|
|
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 = []
|
|
|
|
|
@ -403,6 +501,7 @@
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//获取可用设备列表
|
|
|
|
|
let deviceList = ref([])
|
|
|
|
|
const GetDeviceList = () => {
|
|
|
|
|
|