feat(operatingroom): 添加手术室类型和所属科室字段支持

- 在手术室管理界面添加类型和所属科室表格列显示
- 添加手术室类型下拉选择功能,支持急诊、择期、日间、复合四种类型
- 添加手术室详情查看页面中的类型字段展示
- 在后端服务中实现手术室类型的字典转换和文本显示
- 添加手术室实体类中的类型和所属机构名称字段
- 更新路由配置注释掉废弃的系统管理相关路径配置
This commit is contained in:
2026-01-09 17:18:07 +08:00
parent d332650bfa
commit cf9ab03b17
5 changed files with 195 additions and 110 deletions

View File

@@ -76,6 +76,26 @@ public class OperatingRoomAppServiceImpl implements IOperatingRoomAppService {
operatingRoomPage.getRecords().forEach(e -> { operatingRoomPage.getRecords().forEach(e -> {
// 状态 // 状态
e.setStatusEnum_dictText(e.getStatusEnum() != null && e.getStatusEnum() == 1 ? "启用" : "停用"); e.setStatusEnum_dictText(e.getStatusEnum() != null && e.getStatusEnum() == 1 ? "启用" : "停用");
// 类型
if (e.getRoomTypeEnum() != null) {
switch (e.getRoomTypeEnum()) {
case 1:
e.setRoomTypeEnum_dictText("急诊手术室");
break;
case 2:
e.setRoomTypeEnum_dictText("择期手术室");
break;
case 3:
e.setRoomTypeEnum_dictText("日间手术室");
break;
case 4:
e.setRoomTypeEnum_dictText("复合手术室");
break;
default:
e.setRoomTypeEnum_dictText("未知");
break;
}
}
// 拼音码 // 拼音码
e.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(e.getName())); e.setPyStr(ChineseConvertUtils.toPinyinFirstLetter(e.getName()));
// 五笔码 // 五笔码
@@ -105,6 +125,27 @@ public class OperatingRoomAppServiceImpl implements IOperatingRoomAppService {
operatingRoomDto.setStatusEnum_dictText( operatingRoomDto.setStatusEnum_dictText(
operatingRoom.getStatusEnum() != null && operatingRoom.getStatusEnum() == 1 ? "启用" : "停用"); operatingRoom.getStatusEnum() != null && operatingRoom.getStatusEnum() == 1 ? "启用" : "停用");
// 类型描述
if (operatingRoom.getRoomTypeEnum() != null) {
switch (operatingRoom.getRoomTypeEnum()) {
case 1:
operatingRoomDto.setRoomTypeEnum_dictText("急诊手术室");
break;
case 2:
operatingRoomDto.setRoomTypeEnum_dictText("择期手术室");
break;
case 3:
operatingRoomDto.setRoomTypeEnum_dictText("日间手术室");
break;
case 4:
operatingRoomDto.setRoomTypeEnum_dictText("复合手术室");
break;
default:
operatingRoomDto.setRoomTypeEnum_dictText("未知");
break;
}
}
// 如果有机构ID查询机构名称 // 如果有机构ID查询机构名称
if (operatingRoom.getOrganizationId() != null) { if (operatingRoom.getOrganizationId() != null) {
String orgName = commonService.getOrgNameById(operatingRoom.getOrganizationId()); String orgName = commonService.getOrgNameById(operatingRoom.getOrganizationId());

View File

@@ -2,6 +2,7 @@ package com.openhis.web.basedatamanage.dto;
import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.openhis.common.annotation.Dict;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@@ -35,6 +36,13 @@ public class OperatingRoomDto implements Serializable {
*/ */
private String name; private String name;
/**
* 手术室类型
*/
@Dict(dictCode = "operating_room_type")
private Integer roomTypeEnum;
private String roomTypeEnum_dictText;
/** /**
* 所属机构ID * 所属机构ID
*/ */

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.core.common.core.domain.HisBaseEntity; import com.core.common.core.domain.HisBaseEntity;
import com.openhis.common.annotation.Dict;
import com.openhis.common.enums.LocationStatus; import com.openhis.common.enums.LocationStatus;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -31,9 +32,17 @@ public class OperatingRoom extends HisBaseEntity {
/** 手术室名称 */ /** 手术室名称 */
private String name; private String name;
/** 手术室类型 */
@Dict(dictCode = "operating_room_type")
private Integer roomTypeEnum;
private String roomTypeEnum_dictText;
/** 所属机构ID */ /** 所属机构ID */
private Long organizationId; private Long organizationId;
/** 所属机构名称 */
private String organizationName;
/** 位置描述 */ /** 位置描述 */
private String locationDescription; private String locationDescription;

View File

@@ -113,116 +113,116 @@ export const constantRoutes = [
] ]
}, },
// 兼容系统业务管理路径 // 兼容系统业务管理路径
{ // {
path: '/system/ywgz', // path: '/system/ywgz',
component: Layout, // component: Layout,
redirect: '/system/ywgz/InvoiceManagement', // redirect: '/system/ywgz/InvoiceManagement',
hidden: true, // hidden: true,
children: [ // children: [
{ // {
path: 'InvoiceManagement', // path: 'InvoiceManagement',
component: () => import('@/views/basicmanage/InvoiceManagement/index.vue'), // component: () => import('@/views/basicmanage/InvoiceManagement/index.vue'),
name: 'SystemInvoiceManagement', // name: 'SystemInvoiceManagement',
meta: { title: '发票管理' } // meta: { title: '发票管理' }
} // }
] // ]
}, // },
{ // {
path: '/maintainSystem', // path: '/maintainSystem',
component: Layout, // component: Layout,
redirect: '/maintainSystem/chargeConfig', // redirect: '/maintainSystem/chargeConfig',
name: 'MaintainSystem', // name: 'MaintainSystem',
meta: { title: '维护系统', icon: 'system' }, // meta: { title: '维护系统', icon: 'system' },
children: [ // children: [
{ // {
path: '', // path: '',
redirect: 'chargeConfig' // redirect: 'chargeConfig'
}, // },
{ // {
path: 'chargeConfig', // path: 'chargeConfig',
component: () => import('@/views/maintainSystem/chargeConfig/index.vue'), // component: () => import('@/views/maintainSystem/chargeConfig/index.vue'),
name: 'ChargeConfig', // name: 'ChargeConfig',
meta: { title: '挂号收费系统参数维护', icon: 'config', permissions: ['maintainSystem:chargeConfig:list'] } // meta: { title: '挂号收费系统参数维护', icon: 'config', permissions: ['maintainSystem:chargeConfig:list'] }
}, // },
{ // {
path: 'Inspection', // path: 'Inspection',
component: () => import('@/views/maintainSystem/Inspection/index.vue'), // component: () => import('@/views/maintainSystem/Inspection/index.vue'),
name: 'Inspection', // name: 'Inspection',
meta: { title: '检验管理', icon: 'inspection' }, // meta: { title: '检验管理', icon: 'inspection' },
children: [ // children: [
{ // {
path: 'PackageManagement', // path: 'PackageManagement',
component: () => import('@/views/maintainSystem/Inspection/PackageManagement.vue'), // component: () => import('@/views/maintainSystem/Inspection/PackageManagement.vue'),
name: 'PackageManagement', // name: 'PackageManagement',
meta: { title: '套餐管理' } // meta: { title: '套餐管理' }
} // }
] // ]
} // }
] // ]
}, // },
{ // {
path: '/system', // path: '/system',
component: Layout, // component: Layout,
redirect: '/system/user', // redirect: '/system/user',
name: 'System', // name: 'System',
meta: { title: '系统管理', icon: 'system' }, // meta: { title: '系统管理', icon: 'system' },
children: [ // children: [
{ // {
path: 'user', // path: 'user',
component: () => import('@/views/system/user/index.vue'), // component: () => import('@/views/system/user/index.vue'),
name: 'User', // name: 'User',
meta: { title: '用户管理', icon: 'user', permissions: ['system:user:list'] } // meta: { title: '用户管理', icon: 'user', permissions: ['system:user:list'] }
}, // },
{ // {
path: 'role', // path: 'role',
component: () => import('@/views/system/role/index.vue'), // component: () => import('@/views/system/role/index.vue'),
name: 'Role', // name: 'Role',
meta: { title: '角色管理', icon: 'role', permissions: ['system:role:list'] } // meta: { title: '角色管理', icon: 'role', permissions: ['system:role:list'] }
}, // },
{ // {
path: 'menu', // path: 'menu',
component: () => import('@/views/system/menu/index.vue'), // component: () => import('@/views/system/menu/index.vue'),
name: 'Menu', // name: 'Menu',
meta: { title: '菜单管理', icon: 'menu', permissions: ['system:menu:list'] } // meta: { title: '菜单管理', icon: 'menu', permissions: ['system:menu:list'] }
}, // },
{ // {
path: 'dept', // path: 'dept',
component: () => import('@/views/system/dept/index.vue'), // component: () => import('@/views/system/dept/index.vue'),
name: 'Dept', // name: 'Dept',
meta: { title: '部门管理', icon: 'dept', permissions: ['system:dept:list'] } // meta: { title: '部门管理', icon: 'dept', permissions: ['system:dept:list'] }
}, // },
{ // {
path: 'post', // path: 'post',
component: () => import('@/views/system/post/index.vue'), // component: () => import('@/views/system/post/index.vue'),
name: 'Post', // name: 'Post',
meta: { title: '岗位管理', icon: 'post', permissions: ['system:post:list'] } // meta: { title: '岗位管理', icon: 'post', permissions: ['system:post:list'] }
}, // },
{ // {
path: 'dict', // path: 'dict',
component: () => import('@/views/system/dict/index.vue'), // component: () => import('@/views/system/dict/index.vue'),
name: 'Dict', // name: 'Dict',
meta: { title: '字典管理', icon: 'dict', permissions: ['system:dict:list'] } // meta: { title: '字典管理', icon: 'dict', permissions: ['system:dict:list'] }
}, // },
{ // {
path: 'config', // path: 'config',
component: () => import('@/views/system/config/index.vue'), // component: () => import('@/views/system/config/index.vue'),
name: 'Config', // name: 'Config',
meta: { title: '参数配置', icon: 'config', permissions: ['system:config:list'] } // meta: { title: '参数配置', icon: 'config', permissions: ['system:config:list'] }
}, // },
{ // {
path: 'notice', // path: 'notice',
component: () => import('@/views/system/notice/index.vue'), // component: () => import('@/views/system/notice/index.vue'),
name: 'Notice', // name: 'Notice',
meta: { title: '通知公告', icon: 'notice', permissions: ['system:notice:list'] } // meta: { title: '通知公告', icon: 'notice', permissions: ['system:notice:list'] }
}, // },
{ // {
path: 'tenant', // path: 'tenant',
component: () => import('@/views/system/tenant/index.vue'), // component: () => import('@/views/system/tenant/index.vue'),
name: 'Tenant', // name: 'Tenant',
meta: { title: '租户管理', icon: 'tenant', permissions: ['system:tenant:list'] } // meta: { title: '租户管理', icon: 'tenant', permissions: ['system:tenant:list'] }
} // }
] // ]
}, // },
{ {
path: '/system/tenant-user', path: '/system/tenant-user',
component: Layout, component: Layout,

View File

@@ -52,6 +52,8 @@
<el-table-column label="序号" type="index" align="center" width="60" /> <el-table-column label="序号" type="index" align="center" width="60" />
<el-table-column label="手术室编码" align="center" prop="busNo" width="120" show-overflow-tooltip /> <el-table-column label="手术室编码" align="center" prop="busNo" width="120" show-overflow-tooltip />
<el-table-column label="手术室名称" align="center" prop="name" min-width="150" show-overflow-tooltip /> <el-table-column label="手术室名称" align="center" prop="name" min-width="150" show-overflow-tooltip />
<el-table-column label="类型" align="center" prop="roomTypeEnum_dictText" width="100" />
<el-table-column label="所属科室" align="center" prop="organizationName" width="120" show-overflow-tooltip />
<el-table-column label="位置描述" align="center" prop="locationDescription" min-width="150" show-overflow-tooltip /> <el-table-column label="位置描述" align="center" prop="locationDescription" min-width="150" show-overflow-tooltip />
<el-table-column label="设备配置" align="center" prop="equipmentConfig" min-width="200" show-overflow-tooltip /> <el-table-column label="设备配置" align="center" prop="equipmentConfig" min-width="200" show-overflow-tooltip />
<el-table-column label="容纳人数" align="center" prop="capacity" width="100" /> <el-table-column label="容纳人数" align="center" prop="capacity" width="100" />
@@ -109,6 +111,18 @@
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="类型" prop="roomTypeEnum">
<el-select v-model="form.roomTypeEnum" placeholder="请选择类型" style="width: 100%">
<el-option
v-for="item in roomTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="所属科室" prop="organizationId"> <el-form-item label="所属科室" prop="organizationId">
<el-select <el-select
@@ -128,6 +142,9 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12"> <el-col :span="12">
<el-form-item label="状态" prop="statusEnum"> <el-form-item label="状态" prop="statusEnum">
<el-select v-model="form.statusEnum" placeholder="请选择状态" style="width: 100%"> <el-select v-model="form.statusEnum" placeholder="请选择状态" style="width: 100%">
@@ -196,6 +213,7 @@
<el-descriptions :column="2" border> <el-descriptions :column="2" border>
<el-descriptions-item label="手术室编码">{{ viewData.busNo }}</el-descriptions-item> <el-descriptions-item label="手术室编码">{{ viewData.busNo }}</el-descriptions-item>
<el-descriptions-item label="手术室名称">{{ viewData.name }}</el-descriptions-item> <el-descriptions-item label="手术室名称">{{ viewData.name }}</el-descriptions-item>
<el-descriptions-item label="类型">{{ viewData.roomTypeEnum_dictText }}</el-descriptions-item>
<el-descriptions-item label="位置描述">{{ viewData.locationDescription }}</el-descriptions-item> <el-descriptions-item label="位置描述">{{ viewData.locationDescription }}</el-descriptions-item>
<el-descriptions-item label="容纳人数">{{ viewData.capacity }}</el-descriptions-item> <el-descriptions-item label="容纳人数">{{ viewData.capacity }}</el-descriptions-item>
<el-descriptions-item label="所属科室">{{ viewData.organizationName }}</el-descriptions-item> <el-descriptions-item label="所属科室">{{ viewData.organizationName }}</el-descriptions-item>
@@ -260,6 +278,7 @@ const form = ref({
id: undefined, id: undefined,
busNo: undefined, busNo: undefined,
name: undefined, name: undefined,
roomTypeEnum: undefined,
organizationId: undefined, organizationId: undefined,
locationDescription: undefined, locationDescription: undefined,
equipmentConfig: undefined, equipmentConfig: undefined,
@@ -272,6 +291,13 @@ const form = ref({
const operatingRoomRef = ref() const operatingRoomRef = ref()
const viewData = ref({}) const viewData = ref({})
const roomTypeOptions = ref([
{ value: 1, label: '急诊手术室' },
{ value: 2, label: '择期手术室' },
{ value: 3, label: '日间手术室' },
{ value: 4, label: '复合手术室' }
])
const statusOptions = ref([ const statusOptions = ref([
{ value: 1, label: '启用' }, { value: 1, label: '启用' },
{ value: 0, label: '停用' } { value: 0, label: '停用' }
@@ -344,6 +370,7 @@ function reset() {
id: undefined, id: undefined,
busNo: undefined, busNo: undefined,
name: undefined, name: undefined,
roomTypeEnum: undefined,
organizationId: undefined, organizationId: undefined,
locationDescription: undefined, locationDescription: undefined,
equipmentConfig: undefined, equipmentConfig: undefined,