docs(requirement): 添加手术室维护界面需求文档

- 创建手术室维护界面PRD文档
- 定义页面概述、核心功能和用户价值
- 设计整体布局和页面区域详细描述
- 规范交互功能和数据结构说明
- 说明开发实现要点和注意事项
- 移除中医诊断主诊断功能实现说明文档
- 移除公告通知弹窗功能说明文档
- 移除手术人员字段不显示问题解决方案文档
- 移除手术和麻醉信息Redis缓存实现说明文档
- 移除手术室管理添加类型和所属科室字段说明文档
This commit is contained in:
2026-01-13 14:41:27 +08:00
parent e20e2b637f
commit a47306825a
71 changed files with 630 additions and 2519 deletions

View File

@@ -11,7 +11,7 @@ export default {
inDiagName: '急性上呼吸道感染',
name: '于浩',
officeName: '住院科室',
title: '长春市朝阳区中医院',
title: '',
operaDays: null,
outdate: null,
sex: '女',

View File

@@ -2,7 +2,7 @@
<div class="recordBill">
<div :id="'exeSheetTitle' + printData.id" class="printView_header">
<div style="text-align: center; height: 60px">
长春市朝阳区中医院医嘱执行单
{{ userStore.hospitalName }}医嘱执行单
</div>
<div>
<span style="display: inline-block; width: 100px">床号{{ printData.patientInfo.encounterLocationName }}</span>
@@ -87,8 +87,13 @@
</template>
<script>
import {getLodop} from '../../../plugins/print/LodopFuncs'
import useUserStore from '@/store/modules/user'
export default {
setup() {
const userStore = useUserStore();
return { userStore };
},
props: {
printData: {
type: Object,

View File

@@ -2,7 +2,7 @@
<div class="recordBill">
<div id="div1" class="printView_header">
<div style="text-align: center; font-size: 20px; height: 40px">
长春市朝阳区中医院输液执行单
{{ userStore.hospitalName }}输液执行单
</div>
<div>
<span>座位{{ printData.patientInfo.encounterLocationName }}</span>
@@ -61,8 +61,13 @@
</template>
<script>
import {getLodop} from '../../../plugins/print/LodopFuncs'
import useUserStore from '@/store/modules/user'
export default {
setup() {
const userStore = useUserStore();
return { userStore };
},
data() {
return {
printData: {

View File

@@ -1,6 +1,6 @@
<template>
<div class="printTicket">
<p>长春市朝阳区中医院</p>
<p>{{ userStore.hospitalName }}</p>
<div>
<span>姓名</span>
<span>{{ printData.patientName }}</span>
@@ -26,9 +26,14 @@
</template>
<script>
import JsBarcode from 'jsbarcode';
import useUserStore from '@/store/modules/user';
export default {
name: 'TriageTicket',
setup() {
const userStore = useUserStore();
return { userStore };
},
props: {
printData: {
type: Object,

View File

@@ -44,7 +44,7 @@
"top": 15,
"height": 16.5,
"width": 792,
"title": "长春市朝阳区中医院预交金收据",
"title": "{{HOSPITAL_NAME}}预交金收据",
"coordinateSync": false,
"widthHeightSync": false,
"fontWeight": "bold",

View File

@@ -44,7 +44,7 @@
"top": 38,
"height": 19.5,
"width": 255,
"title": "中药长春市朝阳区中医院",
"title": "中药{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 11.25,

View File

@@ -108,7 +108,7 @@
"top": 58.5,
"height": 13.5,
"width": 145.5,
"title": "机构名称:长春市朝阳区中医院",
"title": "机构名称:{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,

View File

@@ -44,7 +44,7 @@
"top": 22.5,
"height": 19.5,
"width": 420,
"title": "长春市朝阳区中医院",
"title": "{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,

View File

@@ -43,7 +43,7 @@
"top": 39.5,
"height": 19.5,
"width": 255,
"title": "中药长春市朝阳区中医院",
"title": "中药{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 11.25,

View File

@@ -44,7 +44,7 @@
"top": 22.5,
"height": 19.5,
"width": 595.5,
"title": "长春市朝阳区中医院",
"title": "{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,

View File

@@ -44,7 +44,7 @@
"top": 22.5,
"height": 19.5,
"width": 420,
"title": "长春市朝阳区中医院",
"title": "{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,

View File

@@ -44,7 +44,7 @@
"top": 22.5,
"height": 19.5,
"width": 595.5,
"title": "长春市朝阳区中医院",
"title": "{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,

View File

@@ -44,7 +44,7 @@
"top": 15,
"height": 16.5,
"width": 225,
"title": "长春市朝阳区中医院门诊收费结算单",
"title": "{{HOSPITAL_NAME}}门诊收费结算单",
"coordinateSync": false,
"widthHeightSync": false,
"fontWeight": "bold",

View File

@@ -43,7 +43,7 @@
"top": 22.5,
"height": 19.5,
"width": 595.5,
"title": "长春市朝阳区中医院",
"title": "{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,

View File

@@ -45,7 +45,7 @@
"top": 15,
"height": 16.5,
"width": 226.5,
"title": "长春市朝阳区中医院挂号收费明细",
"title": "{{HOSPITAL_NAME}}挂号收费明细",
"coordinateSync": false,
"widthHeightSync": false,
"fontWeight": "bold",

View File

@@ -43,7 +43,7 @@
"top": 20,
"height": 19.5,
"width": 228,
"title": "中药长春市朝阳区中医院",
"title": "中药{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 11.25,

View File

@@ -44,7 +44,7 @@
"top": 20,
"height": 19.5,
"width": 420,
"title": "长春市朝阳区中医院",
"title": "{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 11.25,

View File

@@ -44,7 +44,7 @@
"top": 38,
"height": 19.5,
"width": 255,
"title": "中药长春市朝阳区中医院",
"title": "中药{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 11.25,

View File

@@ -43,7 +43,7 @@
"top": 22.5,
"height": 19.5,
"width": 420,
"title": "长春市朝阳区中医院",
"title": "{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 20.25,

View File

@@ -1,4 +1,4 @@
import { createWebHistory, createRouter } from 'vue-router'
import {createWebHistory, createRouter} from 'vue-router'
/* Layout */
import Layout from '@/layout'
@@ -16,366 +16,86 @@ import Layout from '@/layout'
* roles: ['admin', 'common'] // 访问路由的角色权限
* permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限
* meta : {
noCache: true // 如果设置为true则不会被 <keep-alive> 缓存(默认 false)
title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
icon: 'svg-name' // 设置该路由的图标对应路径src/assets/icons/svg
breadcrumb: false // 如果设置为false则不会在breadcrumb面包屑中显示
activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。
}
noCache: true // 如果设置为true则不会被 <keep-alive> 缓存(默认 false)
title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字
icon: 'svg-name' // 设置该路由的图标对应路径src/assets/icons/svg
breadcrumb: false // 如果设置为false则不会在breadcrumb面包屑中显示
activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。
}
*/
// 公共路由
export const constantRoutes = [
{
path: '/redirect',
component: Layout,
hidden: true,
children: [
{
path: '/redirect/:path(.*)',
component: () => import('@/views/redirect/index.vue')
}
]
},
{
path: '/login',
component: () => import('@/views/login'),
hidden: true
},
{
path: '/register',
component: () => import('@/views/register'),
hidden: true
},
{
path: '/401',
component: () => import('@/views/error/401'),
hidden: true
},
{
path: '',
component: Layout,
redirect: '/index',
children: [
{
path: '/index',
component: () => import('@/views/index'),
name: 'Index',
meta: { title: '首页', icon: 'dashboard', affix: true }
}
]
},
{
path: '/user',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: 'profile',
component: () => import('@/views/system/user/profile/index'),
name: 'Profile',
meta: { title: '个人中心', icon: 'user' }
}
]
},
// 添加套餐管理相关路由到公共路由,确保始终可用
{
path: '/maintainSystem/Inspection/PackageManagement',
component: Layout,
hidden: true,
children: [
{
{
path: '/redirect',
component: Layout,
hidden: true,
children: [
{
path: '/redirect/:path(.*)',
component: () => import('@/views/redirect/index.vue')
}
]
},
{
path: '/login',
component: () => import('@/views/login'),
hidden: true
},
{
path: '/register',
component: () => import('@/views/register'),
hidden: true
},
{
path: '/401',
component: () => import('@/views/error/401'),
hidden: true
},
{
path: '',
component: () => import('@/views/maintainSystem/Inspection/PackageManagement.vue'),
name: 'DirectPackageManagement',
meta: { title: '套餐管理' }
}
]
}
component: Layout,
redirect: '/index',
children: [
{
path: '/index',
component: () => import('@/views/index'),
name: 'Index',
meta: {title: '首页', icon: 'dashboard', affix: true}
}
]
},
{
path: '/user',
component: Layout,
hidden: true,
redirect: 'noredirect',
children: [
{
path: 'profile',
component: () => import('@/views/system/user/profile/index'),
name: 'Profile',
meta: {title: '个人中心', icon: 'user'}
}
]
}
]
// 动态路由,基于用户权限动态去加载
export const dynamicRoutes = [
export const dynamicRoutes = [
{
path: '/basicmanage',
component: Layout,
redirect: '/basicmanage/invoice-management',
name: 'BasicManage',
meta: { title: '基础管理', icon: 'component' },
children: [
{
path: 'invoice-management',
component: () => import('@/views/basicmanage/InvoiceManagement/index.vue'),
name: 'invoice-management',
meta: { title: '发票管理' }
}
]
path: '/help-center',
component: Layout,
hidden: true,
children: [
{
path: '',
component: () => import('@/views/helpcenter/index.vue'),
name: 'HelpCenter',
meta: {title: '帮助中心'},
},
],
},
// 兼容系统业务管理路径
// {
// path: '/system/ywgz',
// component: Layout,
// redirect: '/system/ywgz/InvoiceManagement',
// hidden: true,
// children: [
// {
// path: 'InvoiceManagement',
// component: () => import('@/views/basicmanage/InvoiceManagement/index.vue'),
// name: 'SystemInvoiceManagement',
// meta: { title: '发票管理' }
// }
// ]
// },
// {
// path: '/maintainSystem',
// component: Layout,
// redirect: '/maintainSystem/chargeConfig',
// name: 'MaintainSystem',
// meta: { title: '维护系统', icon: 'system' },
// children: [
// {
// path: '',
// redirect: 'chargeConfig'
// },
// {
// path: 'chargeConfig',
// component: () => import('@/views/maintainSystem/chargeConfig/index.vue'),
// name: 'ChargeConfig',
// meta: { title: '挂号收费系统参数维护', icon: 'config', permissions: ['maintainSystem:chargeConfig:list'] }
// },
// {
// path: 'Inspection',
// component: () => import('@/views/maintainSystem/Inspection/index.vue'),
// name: 'Inspection',
// meta: { title: '检验管理', icon: 'inspection' },
// children: [
// {
// path: 'PackageManagement',
// component: () => import('@/views/maintainSystem/Inspection/PackageManagement.vue'),
// name: 'PackageManagement',
// meta: { title: '套餐管理' }
// }
// ]
// }
// ]
// },
// {
// path: '/system',
// component: Layout,
// redirect: '/system/user',
// name: 'System',
// meta: { title: '系统管理', icon: 'system' },
// children: [
// {
// path: 'user',
// component: () => import('@/views/system/user/index.vue'),
// name: 'User',
// meta: { title: '用户管理', icon: 'user', permissions: ['system:user:list'] }
// },
// {
// path: 'role',
// component: () => import('@/views/system/role/index.vue'),
// name: 'Role',
// meta: { title: '角色管理', icon: 'role', permissions: ['system:role:list'] }
// },
// {
// path: 'menu',
// component: () => import('@/views/system/menu/index.vue'),
// name: 'Menu',
// meta: { title: '菜单管理', icon: 'menu', permissions: ['system:menu:list'] }
// },
// {
// path: 'dept',
// component: () => import('@/views/system/dept/index.vue'),
// name: 'Dept',
// meta: { title: '部门管理', icon: 'dept', permissions: ['system:dept:list'] }
// },
// {
// path: 'post',
// component: () => import('@/views/system/post/index.vue'),
// name: 'Post',
// meta: { title: '岗位管理', icon: 'post', permissions: ['system:post:list'] }
// },
// {
// path: 'dict',
// component: () => import('@/views/system/dict/index.vue'),
// name: 'Dict',
// meta: { title: '字典管理', icon: 'dict', permissions: ['system:dict:list'] }
// },
// {
// path: 'config',
// component: () => import('@/views/system/config/index.vue'),
// name: 'Config',
// meta: { title: '参数配置', icon: 'config', permissions: ['system:config:list'] }
// },
// {
// path: 'notice',
// component: () => import('@/views/system/notice/index.vue'),
// name: 'Notice',
// meta: { title: '通知公告', icon: 'notice', permissions: ['system:notice:list'] }
// },
// {
// path: 'tenant',
// component: () => import('@/views/system/tenant/index.vue'),
// name: 'Tenant',
// meta: { title: '租户管理', icon: 'tenant', permissions: ['system:tenant:list'] }
// }
// ]
// },
{
path: '/system/tenant-user',
component: Layout,
hidden: true,
permissions: ['*:*:*'],
children: [
{
path: 'set/:tenantId(\\d+)',
component: () => import('@/views/system/tenant/setUser'),
name: 'SetUser',
meta: { title: '所属用户', activeMenu: '/system/tenant' }
}
]
},
{
path: '/system/tenant-contract',
component: Layout,
hidden: true,
permissions: ['*:*:*'],
children: [
{
path: 'set/:tenantId(\\d+)',
component: () => import('@/views/system/tenant/setContract'),
name: 'SetContract',
meta: { title: '合同管理', activeMenu: '/system/tenant' }
}
]
},
{
path: '/system/user-auth',
component: Layout,
hidden: true,
permissions: ['system:user:edit'],
children: [
{
path: 'role/:userId(\\d+)',
component: () => import('@/views/system/user/authRole'),
name: 'AuthRole',
meta: { title: '分配角色', activeMenu: '/system/user' }
}
]
},
{
path: '/system/role-auth',
component: Layout,
hidden: true,
permissions: ['system:role:edit'],
children: [
{
path: 'user/:roleId(\\d+)',
component: () => import('@/views/system/role/authUser'),
name: 'AuthUser',
meta: { title: '分配用户', activeMenu: '/system/role' }
}
]
},
{
path: '/system/dict-data',
component: Layout,
hidden: true,
permissions: ['system:dict:list'],
children: [
{
path: 'index/:dictId(\\d+)',
component: () => import('@/views/system/dict/data'),
name: 'Data',
meta: { title: '字典数据', activeMenu: '/system/dict' }
}
]
},
{
path: '/monitor',
component: Layout,
redirect: '/monitor/operlog',
name: 'Monitor',
meta: { title: '系统监控', icon: 'monitor' },
children: [
{
path: 'operlog',
component: () => import('@/views/monitor/operlog/index.vue'),
name: 'Operlog',
meta: { title: '操作日志', icon: 'operlog', permissions: ['monitor:operlog:list'] }
},
{
path: 'logininfor',
component: () => import('@/views/monitor/logininfor/index.vue'),
name: 'Logininfor',
meta: { title: '登录日志', icon: 'logininfor', permissions: ['monitor:logininfor:list'] }
},
{
path: 'job',
component: () => import('@/views/monitor/job/index.vue'),
name: 'Job',
meta: { title: '定时任务', icon: 'job', permissions: ['monitor:job:list'] }
}
]
},
{
path: '/tool',
component: Layout,
redirect: '/tool/gen',
name: 'Tool',
meta: { title: '系统工具', icon: 'tool' },
children: [
{
path: 'gen',
component: () => import('@/views/tool/gen/index.vue'),
name: 'Gen',
meta: { title: '代码生成', icon: 'gen', permissions: ['tool:gen:list'] }
}
]
},
{
path: '/monitor/job-log',
component: Layout,
hidden: true,
permissions: ['monitor:job:list'],
children: [
{
path: 'index/:jobId(\\d+)',
component: () => import('@/views/monitor/job/log'),
name: 'JobLog',
meta: { title: '调度日志', activeMenu: '/monitor/job' }
}
]
},
{
path: '/tool/gen-edit',
component: Layout,
hidden: true,
permissions: ['tool:gen:edit'],
children: [
{
path: 'index/:tableId(\\d+)',
component: () => import('@/views/tool/gen/editTable'),
name: 'GenEdit',
meta: { title: '修改生成配置', activeMenu: '/tool/gen' }
}
]
},
{
path: '/help-center',
component: Layout,
hidden: true,
children: [
{
path: '',
component: () => import('@/views/helpcenter/index.vue'),
name: 'HelpCenter',
meta: { title: '帮助中心'},
},
],
},
];
// 合并常量路由和动态路由,确保所有路由都能被访问
@@ -383,21 +103,21 @@ const allRoutes = [...constantRoutes, ...dynamicRoutes];
// 添加404路由到所有路由的最后
allRoutes.push({
path: "/:pathMatch(.*)*",
component: () => import('@/views/error/404'),
hidden: true
path: "/:pathMatch(.*)*",
component: () => import('@/views/error/404'),
hidden: true
});
const router = createRouter({
history: createWebHistory(),
routes: allRoutes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
return { top: 0 }
}
},
history: createWebHistory(),
routes: allRoutes,
scrollBehavior(to, from, savedPosition) {
if (savedPosition) {
return savedPosition
} else {
return {top: 0}
}
},
});
export default router;

View File

@@ -5,7 +5,7 @@
patient?.busNo || '未知'
}}
</div>
<h2 style="text-align: center">长春市朝阳区中医院</h2>
<h2 style="text-align: center">{{ userStore.hospitalName }}</h2>
<h2 style="text-align: center">出院诊断病历</h2>
<!-- 滚动内容区域 -->
@@ -143,6 +143,9 @@ import {nextTick, onMounted, reactive, ref} from 'vue';
import {ElMessage} from 'element-plus';
import {previewPrint} from '../utils/printUtils';
import DisDiagnMedicalRecord from '../views/hospitalRecord/components/disDiagnMedicalRecord.vue';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
defineOptions({
name: 'DischargeDiagnosisCertificate',

View File

@@ -1,5 +1,8 @@
<script lang="ts" setup>
import {ref} from 'vue';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
// 1. 基础信息(复用已有变量,补充一致性格式)
const patientInfo = ref({
@@ -117,8 +120,8 @@ defineExpose({ patientInfo, firstRecordTime, firstRecordIntro, caseFeatures, chi
<div class="medical-record">
<!-- 1. 医院头部每一页PDF均包含复用已有样式 -->
<div class="hospital-header">
<img src="./imgs/logo.png" alt="长春市朝阳区中医院Logo" class="header-logo" />
<h1 class="hospital-name">长春市朝阳区中医院</h1>
<img src="./imgs/logo.png" :alt="userStore.hospitalName + 'Logo'" class="header-logo" />
<h1 class="hospital-name">{{ userStore.hospitalName }}</h1>
</div>
<!-- 2. 患者信息栏每一页PDF均包含下划线样式 -->

View File

@@ -4,7 +4,7 @@
<!-- 医院头部 -->
<div class="hospital-header">
<h1 class="hospital-name">
<span class="hospital-text">长春市朝阳区中医院</span>
<span class="hospital-text">{{ userStore.hospitalName }}</span>
</h1>
</div>
<!-- 页面标题 -->

View File

@@ -1,7 +1,7 @@
<template>
<div class="medical-form">
<h2 style="text-align: center">
{{ userStore.hospitalName || '长春市朝阳区中医院' }} -入院记录
{{ userStore.hospitalName }} -入院记录
</h2>
<!-- 滚动内容区域 -->

View File

@@ -232,23 +232,13 @@
<script setup>
import {onMounted, reactive, ref} from 'vue';
import intOperRecordSheet from '../views/hospitalRecord/components/intOperRecordSheet.vue';
import {
ElButton,
ElDatePicker,
ElForm,
ElFormItem,
ElInput,
ElMessage,
ElMessageBox,
ElOption,
ElSelect,
} from 'element-plus';
import {previewPrint} from '../utils/printUtils';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const isShowprintDom = ref(false);
const recordPrintRef = ref();
// 医院名称
const hospitalName = '长春市朝阳区中医院';
const hospitalName = userStore.hospitalName;
defineOptions({
name: 'iInHospitalSurgicalRecord',
});

View File

@@ -213,20 +213,11 @@
<script setup>
import {onMounted, reactive, ref} from 'vue';
import {
ElButton,
ElDatePicker,
ElForm,
ElFormItem,
ElInput,
ElMessage,
ElMessageBox,
ElOption,
ElSelect,
} from 'element-plus';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
// 医院名称
const hospitalName = '长春市朝阳区中医院';
const hospitalName = userStore.hospitalName;
defineOptions({
name: 'InHospitalCommunicate',
});

View File

@@ -6,7 +6,7 @@
<template>
<div class="container">
<div class="header">
<h2 class="title">长春市朝阳区中医院</h2>
<h2 class="title">{{ userStore.hospitalName }}</h2>
<h3 class="subtitle">患者护理记录单</h3>
</div>
@@ -234,8 +234,10 @@
defineOptions({
name: 'NursingRecordSheet',
});
import {getCurrentInstance, onBeforeMount, onMounted} from 'vue';
import {getCurrentInstance, onBeforeMount, onMounted, ref} from 'vue';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
const emits = defineEmits([]);
const props = defineProps({

View File

@@ -5,7 +5,7 @@
patient?.busNo || '未知'
}}
</div>
<h2 style="text-align: center">{{ userStore.hospitalName || '长春市朝阳区中医院' }}</h2>
<h2 style="text-align: center">{{ userStore.hospitalName }}</h2>
<h2 style="text-align: center">门诊病历</h2>

View File

@@ -7,7 +7,7 @@
<div class="surgicalPatientHandover-container">
<div class="handover-form">
<div class="form-header">
<h1 class="hospital-name">长春市朝阳区中医院</h1>
<h1 class="hospital-name">{{ userStore.hospitalName }}</h1>
<h2 class="form-title">手术患者交接单</h2>
</div>
@@ -562,6 +562,9 @@ defineOptions({
});
import {getCurrentInstance, onBeforeMount, onMounted, reactive} from 'vue';
import useOptionsList from './useOptionsList';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
// import { A } from '../../dist/assets/api-DmiMW8YF';
const { statisticsOptionList, getStatisticsOptionList } = useOptionsList();
const { proxy } = getCurrentInstance();

View File

@@ -228,7 +228,11 @@ export function executePrint(data, template, printerName, options = {}, business
throw new Error('打印插件未加载');
}
const hiprintTemplate = new window.hiprint.PrintTemplate({ template });
const userStore = useUserStore();
const processedTemplate = JSON.parse(
JSON.stringify(template).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
);
const hiprintTemplate = new window.hiprint.PrintTemplate({ template: processedTemplate });
const printOptions = {
title: '打印标题',
height: 210,

View File

@@ -674,7 +674,9 @@ async function print() {
};
console.log(result, '==result.data==');
const printElements = templateJson;
const printElements = JSON.parse(
JSON.stringify(templateJson).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
);
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
const printerList = hiprintTemplate.getPrinterList();
console.log(hiprintTemplate, '打印机列表');

View File

@@ -110,7 +110,7 @@
"top": 57,
"height": 13.5,
"width": 145.5,
"title": "机构名称:长春市朝阳区中医院",
"title": "机构名称:{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,

View File

@@ -356,7 +356,7 @@ async function print() {
...reportValue.value, // 将 reportValue.value 中的所有属性展开到 result 中
nickName: userStore.nickName,
orgName: userStore.orgName,
fixmedinsName: '长春市朝阳区中医院医院',
fixmedinsName: userStore.hospitalName,
queryTime: queryTime.value[0] + '~' + queryTime.value[1],
zfAmount: new Decimal(reportValue.value.zhSum || 0).add(reportValue.value.fundSum || 0),
feeAmount: new Decimal(reportValue.value.DIAGNOSTIC_FEE || 0)

View File

@@ -514,7 +514,9 @@ async function print() {
};
console.log(result, '==result.data==');
const printElements = templateJson;
const printElements = JSON.parse(
JSON.stringify(templateJson).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
);
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
const printerList = hiprintTemplate.getPrinterList();
console.log(hiprintTemplate, '打印机列表');

View File

@@ -34,7 +34,7 @@
"top": 22.5,
"height": 12,
"width": 420,
"title": "长春市朝阳区中医院",
"title": "{{HOSPITAL_NAME}}",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,

View File

@@ -37,7 +37,7 @@
"top": 16.5,
"height": 22.5,
"width": 120,
"title": "长春市朝阳区中医院医院",
"title": "{{HOSPITAL_NAME}}医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontFamily": "Microsoft YaHei",

View File

@@ -660,7 +660,9 @@ function printPrescription() {
// 将对象转换为 JSON 字符串
console.log(result, 'result');
// 模板对象获取
const printElements = prescriptionTemplate;
const printElements = JSON.parse(
JSON.stringify(prescriptionTemplate).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
);
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
hiprintTemplate.print2(result, {
title: '打印标题',
@@ -695,7 +697,9 @@ function printDisposal() {
.join(',');
advicePrint({ requestIds: requestIds }).then((res) => {
const result = res.data;
const printElements = disposalTemplate;
const printElements = JSON.parse(
JSON.stringify(disposalTemplate).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
);
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
hiprintTemplate.print2(result, {
height: 210,
@@ -735,7 +739,9 @@ function printBloodBarcode() {
} else {
printBloodCode({ requestId: selectedRows[0].requestId }).then((res) => {
const result = res.data;
const printElements = bloodTemplate;
const printElements = JSON.parse(
JSON.stringify(bloodTemplate).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
);
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
hiprintTemplate.print2(result, {
height: 210,

View File

@@ -27,7 +27,7 @@
<span>CF0000000001</span>
</div>
<div style="text-align: center">
<h2>长春市朝阳区中医院医院</h2>
<h2>{{ userStore.hospitalName }}</h2>
</div>
<div style="text-align: center">
<h3>处方单</h3>
@@ -130,7 +130,9 @@
<script setup name="historicalPrescriptionDetail">
import {getPrescriptionDetail} from './api';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
const props = defineProps({

View File

@@ -19,7 +19,7 @@
<span>{{ item.prescriptionNo }}</span>
</div>
<div style="text-align: center">
<h2>长春市朝阳区中医院医院</h2>
<h2>{{ userStore.hospitalName }}</h2>
</div>
<div style="text-align: center">
<h3>处方单</h3>
@@ -144,6 +144,9 @@
import {formatDateStr} from '@/utils/index';
//高精度库
import Decimal from 'decimal.js';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const props = defineProps({
open: {

View File

@@ -15,7 +15,7 @@
"top": 16.5,
"height": 22.5,
"width": 120,
"title": "长春市朝阳区中医院医院",
"title": "{{HOSPITAL_NAME}}医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontFamily": "Microsoft YaHei",

View File

@@ -2,7 +2,7 @@
<div style="padding: 20px; max-width: 1200px; margin: 0 auto" ref="bodyRef">
<!-- 标题区域 - 居中加粗增加层次感 -->
<div style="text-align: center; margin-bottom: 30px">
<div style="font-size: 22px; color: #333; letter-spacing: 1px">长春市朝阳区中医院</div>
<div style="font-size: 22px; color: #333; letter-spacing: 1px">{{ userStore.hospitalName }}</div>
<div
style="
font-size: 32px;
@@ -614,7 +614,7 @@
border-top: 1px solid #eee;
"
>
本记录由长春市朝阳区中医院医师根据患者病情如实记录仅供临床诊疗参考 |
本记录由{{ userStore.hospitalName }}医师根据患者病情如实记录仅供临床诊疗参考 |
地址长春市朝阳区XX街XX号 | 联系电话0431-XXXXXXX
</div>
@@ -629,7 +629,9 @@
<script setup>
import {reactive, ref} from 'vue';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const bodyRef = ref();
// 响应式表单数据

View File

@@ -21,7 +21,7 @@
margin-bottom: 8px;
"
>
长春市朝阳区中医院
{{ userStore.hospitalName }}
</div>
<div
style="
@@ -500,7 +500,9 @@
<script setup>
import {reactive, ref} from 'vue'; // 补充缺失的reactive导入
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const bodyRef = ref(null);
const showPrintPreview = ref(false); // 控制弹窗显隐

View File

@@ -50,7 +50,7 @@
word-wrap: break-word;
"
>
长春市朝阳区中医院
{{ userStore.hospitalName }}
</div>
<div
style="
@@ -721,7 +721,7 @@
word-wrap: break-word;
"
>
长春市朝阳区中医院
{{ userStore.hospitalName }}
</div>
<div
style="
@@ -1346,8 +1346,10 @@
</template>
<script setup>
import {reactive, ref} from 'vue';
import {computed, reactive, ref} from 'vue';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const bodyRef = ref();
const printContentRef = ref(); // 新增打印内容的ref
const showPrintPreview = ref(false); // 控制打印预览弹窗显示

View File

@@ -3,7 +3,7 @@
<!-- 标题区域 - 强化正式感 -->
<div
style="text-align: center; margin-bottom: 30px; padding: 20px; background: #fff; border-radius: 12px; box-shadow: 0 2px 6px rgba(0,0,0,0.03);">
<div style="font-size: 22px; color: #2d3748; letter-spacing: 1px;">长春市朝阳区中医院</div>
<div style="font-size: 22px; color: #2d3748; letter-spacing: 1px;">{{ userStore.hospitalName }}</div>
<div
style="font-size: 28px; font-weight: 700; margin: 12px 0; padding: 8px 0; border-bottom: 2px solid #e8f4f8; display: inline-block;">
住院患者入院沟通记录单</div>
@@ -343,5 +343,7 @@
}
</style>
<script setup>
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
</script>

View File

@@ -11,7 +11,7 @@
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.03);
"
>
<div style="font-size: 22px; color: #2d3748; letter-spacing: 1px">长春市朝阳区中医院</div>
<div style="font-size: 22px; color: #2d3748; letter-spacing: 1px">{{ userStore.hospitalName }}</div>
<div
style="
font-size: 28px;
@@ -823,7 +823,9 @@
<script setup>
import {reactive, ref} from 'vue';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const bodyRef = ref();
// 响应式表单数据
const formData = reactive({

View File

@@ -4,7 +4,7 @@
<div
style="display: flex; flex-direction: column; justify-content: center; align-items: center"
>
<div style="font-size: 20px">长春市朝阳区中医院</div>
<div style="font-size: 20px">{{ userStore.hospitalName }}</div>
<div style="font-size: 30px; font-weight: bold; padding-top: 10px">住院病案首页</div>
</div>
<!-- 线 -->

View File

@@ -86,7 +86,7 @@
金额已满足应收不可继续添加
</el-text>
</div>
<div style="margin-top: 10px" v-if="userStore.hospitalName == '长春市朝阳区中医院'">
<div style="margin-top: 10px" v-if="userStore.fixmedinsCode == 'H22010200672'">
<span>折扣</span>
<el-radio-group v-model="discountRadio" @change="handleDiscountChange">
<el-radio-button
@@ -352,7 +352,9 @@ function printReceipt(param) {
},
],
};
const printElements = templateJson;
const printElements = JSON.parse(
JSON.stringify(templateJson).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
);
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
hiprintTemplate.print2(result.data[0], {
@@ -463,7 +465,9 @@ async function print() {
};
console.log(result, '==result.data==');
const printElements = templateJson;
const printElements = JSON.parse(
JSON.stringify(templateJson).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
);
var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
const printerList = hiprintTemplate.getPrinterList();
console.log(hiprintTemplate, '打印机列表');

View File

@@ -38,7 +38,7 @@
"top": 15,
"height": 16.5,
"width": 142.5,
"title": "长春市朝阳区中医院门诊收费结算单",
"title": "{{HOSPITAL_NAME}}门诊收费结算单",
"coordinateSync": false,
"widthHeightSync": false,
"fontWeight": "bold",

View File

@@ -2,7 +2,7 @@
<div class="container">
<el-form :model="state.form">
<div class="record-container">
<div class="title">长春市朝阳区中医院</div>
<div class="title">{{ userStore.hospitalName }}</div>
<div class="subtitle">入院记录</div>
<div class="header">
<span>姓名: [<el-input v-model="state.form.name" class="inline-input" />]</span>
@@ -98,6 +98,9 @@
<script setup>
import {getCurrentInstance, onBeforeMount, onMounted, reactive} from 'vue'
import useUserStore from '@/store/modules/user'
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
const emits = defineEmits([]);
const props = defineProps({})

View File

@@ -432,6 +432,7 @@ function sliceData(data) {
const types = data.types.filter((item) => item.weekNo === week.value);
// const datas = JSON.parse(JSON.stringify(data));
const datas = cloneDeep(data);
datas.grParamBOS.title = userStore.hospitalName;
datas.rows = rows;
datas.types = types;
console.log(datas, '666666666666666666');

View File

@@ -21,7 +21,7 @@
"top": 12,
"height": 12,
"width": 115.5,
"title": "长春市朝阳区中医院医院盘点单",
"title": "{{HOSPITAL_NAME}}医院盘点单",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
@@ -72,7 +72,7 @@
"top": 33,
"height": 9.75,
"width": 120,
"title": "机构:长春市朝阳区中医院医院",
"title": "机构:{{HOSPITAL_NAME}}医院",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0

View File

@@ -33,7 +33,7 @@
"top": 13.5,
"height": 12,
"width": 75,
"title": "长春市朝阳区中医院医院",
"title": "{{HOSPITAL_NAME}}医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 12,
@@ -84,7 +84,7 @@
"top": 33,
"height": 9.75,
"width": 120,
"title": "机构:长春市朝阳区中医院医院",
"title": "机构:{{HOSPITAL_NAME}}医院",
"coordinateSync": false,
"widthHeightSync": false,
"qrCodeLevel": 0

View File

@@ -26,7 +26,7 @@
placeholder=""
clearable
style="width: 150px">
<el-option label="长春市朝阳区中医院" value="sameHospital" />
<el-option :label="userStore.hospitalName" value="sameHospital" />
</el-select>
</el-form-item>
@@ -120,7 +120,9 @@
<script setup name="OutpatientDepartmentMetrics">
import {getOutpatientDepartmentMetrics} from './statisticalManagent';
import {computed, reactive, ref, toRefs} from 'vue';
import useUserStore from '@/store/modules/user';
const userStore = useUserStore();
const loading = ref(true);
const total = ref(0);
const data = reactive({

View File

@@ -33,8 +33,13 @@
<el-button type="primary" plain icon="Plus" @click="handleAdd">新增手术室</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete">
批量删除
<el-button type="success" plain icon="VideoPlay" :disabled="multiple" @click="handleEnable(ids)">
批量启用
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="VideoPause" :disabled="multiple" @click="handleDisable(ids)">
批量停用
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
@@ -50,7 +55,7 @@
>
<el-table-column type="selection" width="55" align="center" />
<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="roomTypeEnum_dictText" width="100" />
<el-table-column label="所属科室" align="center" prop="organizationName" width="120" show-overflow-tooltip />
@@ -65,16 +70,24 @@
</template>
</el-table-column>
<el-table-column label="显示顺序" align="center" prop="displayOrder" width="100" />
<el-table-column label="操作" align="center" width="180" fixed="right">
<el-table-column label="操作" align="center" width="220" fixed="right">
<template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleEdit(scope.row)">编辑</el-button>
<el-button link type="primary" icon="View" @click="handleView(scope.row)">查看</el-button>
<el-button
v-if="scope.row.statusEnum === 1"
link
type="danger"
icon="Delete"
@click="handleDelete(scope.row)"
>删除</el-button>
type="warning"
icon="VideoPause"
@click="handleDisable([scope.row.id])"
>停用</el-button>
<el-button
v-else
link
type="success"
icon="VideoPlay"
@click="handleEnable([scope.row.id])"
>启用</el-button>
</template>
</el-table-column>
</el-table>
@@ -92,11 +105,19 @@
<el-dialog :title="title" v-model="open" width="700px" append-to-body>
<el-form ref="operatingRoomRef" :model="form" :rules="rules" label-width="120px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="房间号" prop="busNo">
<el-input v-model="form.busNo" placeholder="请输入房间号" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="手术室名称" prop="name">
<el-input v-model="form.name" placeholder="请输入手术室名称" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="容纳人数" prop="capacity">
<el-input-number
@@ -231,11 +252,12 @@
</template>
<script setup name="OperatingRoomManage">
import { listOperatingRoom, getOperatingRoom, addOperatingRoom, updateOperatingRoom, deleteOperatingRoom } from '@/api/operatingroom'
import { listOperatingRoom, getOperatingRoom, addOperatingRoom, updateOperatingRoom, deleteOperatingRoom, enableOperatingRoom, disableOperatingRoom } from '@/api/operatingroom'
import { deptTreeSelect } from '@/api/system/user'
import { computed } from 'vue'
const { proxy } = getCurrentInstance()
const { operating_room_type } = proxy.useDict('operating_room_type')
const loading = ref(true)
const showSearch = ref(true)
const operatingRoomList = ref([])
@@ -291,12 +313,7 @@ const form = ref({
const operatingRoomRef = ref()
const viewData = ref({})
const roomTypeOptions = ref([
{ value: 1, label: '急诊手术室' },
{ value: 2, label: '择期手术室' },
{ value: 3, label: '日间手术室' },
{ value: 4, label: '复合手术室' }
])
const roomTypeOptions = operating_room_type
const statusOptions = ref([
{ value: 1, label: '启用' },
@@ -304,6 +321,7 @@ const statusOptions = ref([
])
const rules = ref({
busNo: [{ required: true, message: '房间号不能为空', trigger: 'blur' }],
name: [{ required: true, message: '手术室名称不能为空', trigger: 'blur' }],
capacity: [
{ required: true, message: '容纳人数不能为空', trigger: 'blur' },
@@ -484,17 +502,30 @@ function submitForm() {
})
}
/** 删除按钮操作 */
function handleDelete(row) {
const ids = row.id || ids.value
/** 启用按钮操作 */
function handleEnable(ids) {
proxy.$modal
.confirm('是否确认删除选中的手术室?')
.confirm('是否确认启用选中的手术室?')
.then(function () {
return deleteOperatingRoom(ids)
return enableOperatingRoom(ids)
})
.then(() => {
getList()
proxy.$modal.msgSuccess('删除成功')
proxy.$modal.msgSuccess('启用成功')
})
.catch(() => {})
}
/** 停用按钮操作 */
function handleDisable(ids) {
proxy.$modal
.confirm('是否确认停用选中的手术室?')
.then(function () {
return disableOperatingRoom(ids)
})
.then(() => {
getList()
proxy.$modal.msgSuccess('停用成功')
})
.catch(() => {})
}

View File

@@ -33,7 +33,7 @@
"top": 22.5,
"height": 12,
"width": 88.5,
"title": "长春市朝阳区中医院医院",
"title": "{{HOSPITAL_NAME}}医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 13.5,

View File

@@ -37,7 +37,7 @@
"top": 16.5,
"height": 22.5,
"width": 120,
"title": "长春市朝阳区中医院医院",
"title": "{{HOSPITAL_NAME}}医院",
"coordinateSync": false,
"widthHeightSync": false,
"fontFamily": "Microsoft YaHei",