Files
his/openhis-ui-vue3/src/views/appoinmentmanage/index.vue

397 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="appoinmentmanage-container">
<div class="appoinmentmanage-header">
<h2 class="appoinmentmanage-title">科室名称管理</h2>
</div>
<div class="appoinmentmanage-content">
<!-- 查询条件 -->
<div class="query-condition">
<el-select v-model="queryParams.orgName" placeholder="全部机构" class="query-select">
<el-option label="全部机构" value=""></el-option>
<el-option label="中联医院" value="中联医院"></el-option>
</el-select>
<el-select v-model="queryParams.deptName" placeholder="全部科室" class="query-select">
<el-option label="全部科室" value=""></el-option>
<el-option v-for="dept in departmentOptions" :key="dept.id || dept.code" :label="dept.name || dept.deptName" :value="dept.name || dept.deptName"></el-option>
</el-select>
<el-button type="primary" @click="handleQuery" class="query-button">查询</el-button>
<el-button @click="handleReset" class="reset-button">重置</el-button>
<el-button type="success" @click="handleAppointmentSetting" class="appointment-setting-button">预约设置</el-button>
</div>
<!-- 科室列表 -->
<div class="dept-table-container">
<el-table :data="deptList" border style="width: 100%" class="centered-table">
<!-- 添加空状态提示 -->
<template #empty>
<div style="padding: 20px 0;">
<el-icon><DocumentRemove /></el-icon>
<span style="margin-left: 8px;">暂无数据</span>
</div>
</template>
<!-- 适配常见的后端字段名 -->
<el-table-column prop="id" label="ID" width="150"></el-table-column>
<el-table-column prop="orgName" label="卫生机构" width="350">
<template #default="scope">
{{ scope.row.orgName || scope.row.organizationName || scope.row.org || '' }}
</template>
</el-table-column>
<el-table-column prop="deptName" label="科室名称" width="350">
<template #default="scope">
{{ scope.row.deptName || scope.row.departmentName || scope.row.name || '' }}
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="400">
<template #default="scope">
{{ scope.row.remark || scope.row.description || scope.row.note || '' }}
</template>
</el-table-column>
<el-table-column prop="status" label="作废标志">
<template #default="scope">
<el-tag :type="(scope.row.status === 1 || scope.row.status === true || scope.row.status === '1') ? 'success' : 'danger'">
{{ (scope.row.status === 1 || scope.row.status === true || scope.row.status === '1') ? '有效' : '无效' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" @click="handleEdit(scope.row)">
<el-icon><EditPen /></el-icon>
</el-button>
<el-button type="info" size="small" @click="handleView(scope.row)">
<el-icon><View /></el-icon>
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<div class="pagination-container">
<el-pagination
v-model:current-page="pagination.currentPage"
v-model:page-size="pagination.pageSize"
:page-sizes="[10, 20, 30, 50]"
layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</div>
</div>
</div>
<!-- 预约设置弹窗 -->
<el-dialog
v-model="appointmentSettingDialog"
title="预约设置"
width="400px"
center
:close-on-click-modal="false"
:close-on-press-escape="false"
top="50%"
:before-close="handleAppointmentSettingCancel"
>
<el-form label-position="top" :model="appointmentSettingForm">
<el-form-item label="取消预约时间类型">
<el-select v-model="appointmentSettingForm.cancelAppointmentType" placeholder="请选择" style="width: 200px">
<el-option label="年" value="年"></el-option>
<el-option label="月" value="月"></el-option>
<el-option label="日" value="日"></el-option>
</el-select>
</el-form-item>
<el-form-item label="取消预约次数">
<el-input-number
v-model="appointmentSettingForm.cancelAppointmentCount"
:min="0"
:step="1"
placeholder="请输入"
></el-input-number>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleAppointmentSettingCancel">取消</el-button>
<el-button type="primary" @click="handleAppointmentSettingConfirm">确定</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup name="AppoinmentManage">
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { ElMessage, ElDialog, ElSelect, ElOption, ElInput, ElForm, ElFormItem } from 'element-plus'
import { EditPen, View, DocumentRemove } from '@element-plus/icons-vue'
import { listDept, searchDept } from '@/api/appoinmentmanage/dept'
import { getLocationTree } from '@/views/charge/outpatientregistration/components/outpatientregistration'
// 查询参数
const queryParams = ref({
orgName: '',
deptName: ''
})
// 科室选项列表
const departmentOptions = ref([])
// 科室列表
const deptList = ref([])
// 分页参数
const pagination = ref({
currentPage: 1,
pageSize: 10,
total: 0
})
// 预约设置弹窗
const appointmentSettingDialog = ref(false)
// 预约设置表单数据
const appointmentSettingForm = ref({
cancelAppointmentType: '年',
cancelAppointmentCount: 0
})
// 获取科室列表(通用方法)
const fetchDeptList = async (apiFunction) => {
try {
const res = await apiFunction({
...queryParams.value,
pageNo: pagination.value.currentPage,
pageSize: pagination.value.pageSize
})
console.log('后端返回的数据:', res)
if (res.code === 200) {
// 适配不同的后端数据结构
let dataList = []
let totalCount = 0
// 首先检查是否存在嵌套的data结构
let actualData = res.data
// 处理嵌套data结构用户提供的格式
if (actualData && actualData.code === 200 && actualData.msg) {
actualData = actualData.data
}
// 检查是否是标准分页结构 (Spring Boot Page)
if (actualData && actualData.content) {
// Spring Boot Page结构使用content字段
dataList = actualData.content
totalCount = actualData.totalElements || 0
} else if (actualData && actualData.records) {
// 自定义分页结构使用records字段
dataList = actualData.records
totalCount = actualData.total || 0
} else if (Array.isArray(actualData)) {
// 直接返回数组
dataList = actualData
totalCount = actualData.length
} else if (actualData && actualData.list) {
// 其他可能的列表字段名
dataList = actualData.list
totalCount = actualData.total || actualData.list.length
} else {
// 默认处理
dataList = actualData || []
totalCount = Array.isArray(actualData) ? actualData.length : 0
}
deptList.value = dataList
pagination.value.total = totalCount
console.log('处理后的数据列表:', deptList.value)
console.log('总记录数:', pagination.value.total)
} else {
ElMessage.error(res.msg || '获取科室列表失败')
}
} catch (error) {
console.error('获取科室列表失败:', error)
ElMessage.error('获取科室列表失败')
}
}
// 获取科室列表(默认列表)
const getDeptList = async () => {
await fetchDeptList(listDept)
}
// 查询
const handleQuery = () => {
pagination.value.currentPage = 1
fetchDeptList(searchDept)
}
// 重置
const handleReset = () => {
queryParams.value = {
orgName: '',
deptName: ''
}
pagination.value.currentPage = 1
getDeptList()
}
// 预约设置弹窗显示
const handleAppointmentSetting = () => {
appointmentSettingDialog.value = true
}
// 预约设置确定
const handleAppointmentSettingConfirm = () => {
// 这里可以添加表单验证和提交逻辑
console.log('预约设置提交:', appointmentSettingForm.value)
ElMessage.success('预约设置保存成功')
appointmentSettingDialog.value = false
}
// 预约设置取消
const handleAppointmentSettingCancel = () => {
appointmentSettingDialog.value = false
}
// 路由和导航
const router = useRouter()
// 编辑
const handleEdit = (row) => {
// 导航到医生排班页面传递科室ID和编辑模式
router.push({
path: `/appoinmentmanage/doctorschedule/${row.id}`,
query: { mode: 'edit' }
})
}
// 查看
const handleView = (row) => {
// 导航到医生排班页面传递科室ID和查看模式
router.push({
path: `/appoinmentmanage/doctorschedule/${row.id}`,
query: { mode: 'view' }
})
}
// 分页大小变化
const handleSizeChange = (size) => {
pagination.value.pageSize = size
getDeptList()
}
// 当前页码变化
const handleCurrentChange = (current) => {
pagination.value.currentPage = current
getDeptList()
}
// 获取门诊挂号的就诊科室数据
const getDepartmentOptions = async () => {
try {
const response = await getLocationTree()
if (response.code === 200) {
// 适配不同的后端数据结构
let actualData = response.data
// 处理嵌套data结构
if (actualData && actualData.code === 200 && actualData.msg) {
actualData = actualData.data
}
// 确保数据是数组格式
if (Array.isArray(actualData)) {
departmentOptions.value = actualData
} else if (actualData && actualData.records) {
departmentOptions.value = actualData.records
} else if (actualData && actualData.content) {
departmentOptions.value = actualData.content
} else if (actualData && actualData.list) {
departmentOptions.value = actualData.list
} else {
departmentOptions.value = []
}
} else {
console.error('获取科室列表失败:', response.msg)
departmentOptions.value = []
}
} catch (error) {
console.error('获取科室列表失败:', error)
departmentOptions.value = []
}
}
// 页面加载时获取科室列表
onMounted(() => {
getDeptList()
getDepartmentOptions()
})
</script>
<style scoped lang="scss">
.appoinmentmanage-container {
width: 100%;
height: 100%;
padding: 20px;
background-color: #f5f7fa;
}
.appoinmentmanage-header {
margin-bottom: 20px;
}
.appoinmentmanage-title {
font-size: 20px;
font-weight: 600;
color: #333;
margin: 0;
}
.appoinmentmanage-content {
background-color: #fff;
border-radius: 8px;
padding: 20px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.query-condition {
display: flex;
align-items: center;
margin-bottom: 20px;
gap: 16px;
}
.query-select {
width: 200px;
}
.query-button, .reset-button, .appointment-setting-button {
min-width: 100px;
}
.dept-table-container {
width: 100%;
}
.pagination-container {
margin-top: 20px;
display: flex;
justify-content: flex-end;
}
/* 表格居中样式 */
.centered-table {
:deep(.el-table__header-wrapper th.el-table__cell),
:deep(.el-table__body-wrapper td.el-table__cell) {
text-align: center;
}
}
</style>
<style scoped>
/* 确保弹窗内容区占满宽度 */
:deep(.el-dialog__body) {
padding: 20px;
}
</style>