diff --git a/openhis-ui-vue3/favicon/site.webmanifest b/openhis-ui-vue3/favicon/site.webmanifest index 68994ad4..e698b5ff 100644 --- a/openhis-ui-vue3/favicon/site.webmanifest +++ b/openhis-ui-vue3/favicon/site.webmanifest @@ -1,19 +1,20 @@ { - "name": "My Awesome App", - "short_name": "AwesomeApp", + "name": "医院信息管理系统", + "short_name": "HIS", "icons": [ { - "src": "/android-chrome-192x192.png", + "src": "/favicon/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "/android-chrome-512x512.png", + "src": "/favicon/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ], - "theme_color": "#ffffff", + "theme_color": "#1890ff", "background_color": "#ffffff", - "display": "standalone" + "display": "standalone", + "description": "医院信息管理系统 - 提供全面的医疗信息化解决方案" } \ No newline at end of file diff --git a/openhis-ui-vue3/index.html b/openhis-ui-vue3/index.html index 003a4ea3..639db44a 100644 --- a/openhis-ui-vue3/index.html +++ b/openhis-ui-vue3/index.html @@ -13,7 +13,7 @@ - + @@ -27,7 +27,7 @@ - + diff --git a/openhis-ui-vue3/src/action/nurseStation/temperatureSheet/datas.js b/openhis-ui-vue3/src/action/nurseStation/temperatureSheet/datas.js index 0e41bfd5..f6149c33 100644 --- a/openhis-ui-vue3/src/action/nurseStation/temperatureSheet/datas.js +++ b/openhis-ui-vue3/src/action/nurseStation/temperatureSheet/datas.js @@ -11,7 +11,7 @@ export default { inDiagName: '急性上呼吸道感染', name: '于浩', officeName: '住院科室', - title: '长春市朝阳区中医院', + title: '', operaDays: null, outdate: null, sex: '女', diff --git a/openhis-ui-vue3/src/api/monitor/operlog.js b/openhis-ui-vue3/src/api/monitor/operlog.js index a04bca84..ebf948eb 100644 --- a/openhis-ui-vue3/src/api/monitor/operlog.js +++ b/openhis-ui-vue3/src/api/monitor/operlog.js @@ -24,3 +24,12 @@ export function cleanOperlog() { method: 'delete' }) } + +// 新增操作日志 +export function addLog(data) { + return request({ + url: '/monitor/operlog', + method: 'post', + data + }) +} diff --git a/openhis-ui-vue3/src/api/surgerymanage.js b/openhis-ui-vue3/src/api/surgerymanage.js index 9fff188c..b29e9d76 100644 --- a/openhis-ui-vue3/src/api/surgerymanage.js +++ b/openhis-ui-vue3/src/api/surgerymanage.js @@ -78,3 +78,16 @@ export function updateSurgeryStatus(id, statusEnum) { params: { id, statusEnum } }) } + +/** + * 根据患者ID查询就诊列表 + * @param patientId 患者ID + * @returns {AxiosPromise} + */ +export function getEncounterListByPatientId(patientId) { + return request({ + url: '/clinical-manage/surgery/encounter-list', + method: 'get', + params: { patientId } + }) +} diff --git a/openhis-ui-vue3/src/assets/icons/svg/patient.svg b/openhis-ui-vue3/src/assets/icons/svg/patient.svg index 283b9c42..0c57c683 100644 --- a/openhis-ui-vue3/src/assets/icons/svg/patient.svg +++ b/openhis-ui-vue3/src/assets/icons/svg/patient.svg @@ -1,4 +1,4 @@ - + diff --git a/openhis-ui-vue3/src/assets/icons/svg/redis-list.svg b/openhis-ui-vue3/src/assets/icons/svg/redis-list.svg index 710cdf3b..0c257379 100644 --- a/openhis-ui-vue3/src/assets/icons/svg/redis-list.svg +++ b/openhis-ui-vue3/src/assets/icons/svg/redis-list.svg @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/openhis-ui-vue3/src/components/Auto/printBills/exeOrderSheet.vue b/openhis-ui-vue3/src/components/Auto/printBills/exeOrderSheet.vue index c5312101..d14db5a6 100644 --- a/openhis-ui-vue3/src/components/Auto/printBills/exeOrderSheet.vue +++ b/openhis-ui-vue3/src/components/Auto/printBills/exeOrderSheet.vue @@ -87,8 +87,13 @@ + \ No newline at end of file diff --git a/openhis-ui-vue3/src/main.js b/openhis-ui-vue3/src/main.js index bf9466cd..4b846eee 100644 --- a/openhis-ui-vue3/src/main.js +++ b/openhis-ui-vue3/src/main.js @@ -4,6 +4,7 @@ import Cookies from 'js-cookie'; // 导入 hiprint 并挂载到全局 window 对象 import {hiprint} from 'vue-plugin-hiprint'; + import ElementPlus, {ElDialog, ElMessage} from 'element-plus'; import zhCn from 'element-plus/es/locale/lang/zh-cn'; import 'element-plus/dist/index.css'; diff --git a/openhis-ui-vue3/src/router/index.js b/openhis-ui-vue3/src/router/index.js index c04ab127..dada00a9 100644 --- a/openhis-ui-vue3/src/router/index.js +++ b/openhis-ui-vue3/src/router/index.js @@ -1,377 +1,123 @@ -import {createRouter, createWebHistory} from 'vue-router'; +import {createWebHistory, createRouter} from 'vue-router' /* Layout */ -import Layout from '@/layout'; +import Layout from '@/layout' /** - * Note: 路由配置项说明 + * Note: 路由配置项 * - * hidden: true // 当设置 true 时,该路由不会在侧边栏出现(如401、login等页面,或一些编辑页面/edit/1) - * alwaysShow: true // 当路由下的 children 声明的路由大于1个时,自动变为嵌套模式(如组件页面) - * // 只有一个时,会将子路由作为根路由显示在侧边栏(如引导页面) - * // 若想不管 children 个数都显示根路由,可设置 alwaysShow: true,忽略之前定义的规则 - * redirect: noRedirect // 当设置 noRedirect 时,该路由在面包屑导航中不可点击 - * name:'router-name' // 设定路由的名字,必须填写,否则使用时会出现问题 + * hidden: true // 当设置 true 的时候该路由不会再侧边栏出现 如401,login等页面,或者如一些编辑页面/edit/1 + * alwaysShow: true // 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + * // 只有一个时,会将那个子路由当做根路由显示在侧边栏--如引导页面 + * // 若你想不管路由下面的 children 声明的个数都显示你的根路由 + * // 你可以设置 alwaysShow: true,这样它就会忽略之前定义的规则,一直显示根路由 + * redirect: noRedirect // 当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 * query: '{"id": 1, "name": "ry"}' // 访问路由的默认传递参数 * roles: ['admin', 'common'] // 访问路由的角色权限 * permissions: ['a:a:a', 'b:b:b'] // 访问路由的菜单权限 - * meta: { - noCache: true // 如果设置为true,则不会被 缓存(默认 false) - title: 'title' // 设置该路由在侧边栏和面包屑中展示的名字 - icon: 'svg-name' // 设置该路由的图标,对应路径src/assets/icons/svg - breadcrumb: false // 如果设置为false,则不会在breadcrumb面包屑中显示 - activeMenu: '/system/user' // 当路由设置了该属性,则会高亮对应的侧边栏 - } + * meta : { + noCache: true // 如果设置为true,则不会被 缓存(默认 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: '/:pathMatch(.*)*', - component: () => import('@/views/error/404'), - 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: '/tpr', - component: () => import('@/views/inpatientNurse/tprsheet/index.vue'), - }, - // { - // path: '/patientmanagement', - // component: Layout, - // redirect: '/patientmanagement/patientmanagement', - // name: 'PatientManagement', - // meta: { title: '患者管理', icon: 'patient' }, - // children: [ - // { - // path: 'patientmanagement', - // component: () => import('@/views/patientmanagement/patientmanagement/index.vue'), - // name: 'PatientManagementList', - // meta: { title: '患者档案管理', icon: 'patient' }, - // }, - // { - // path: 'outpatienrecords', - // component: () => import('@/views/patientmanagement/outpatienrecords/index.vue'), - // name: 'OutpatientRecords', - // meta: { title: '门诊就诊记录', icon: 'record' }, - // }, - // ], - // }, -]; + { + 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'} + } + ] + } +] -// 动态路由 - 基于用户权限动态加载的路由 +// 动态路由,基于用户权限动态去加载 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: '/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', - // name: 'MaintainSystemIndex' // 添加名称以解决警告 - // }, - // { - // 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/basicmanage/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/basicmanage/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/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: '帮助中心'}, + }, + ], + }, ]; // 合并常量路由和动态路由,确保所有路由都能被访问 const allRoutes = [...constantRoutes, ...dynamicRoutes]; -// 添加404路由到所有路由的最后,确保捕获所有未匹配的路由 +// 添加404路由到所有路由的最后 allRoutes.push({ - path: "/:pathMatch(.*)*", - component: () => import('@/views/error/404'), - hidden: true + path: "/:pathMatch(.*)*", + component: () => import('@/views/error/404'), + hidden: true }); -// 创建Vue Router实例 const router = createRouter({ - history: createWebHistory(), // 使用HTML5历史模式 - 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; \ No newline at end of file +export default router; diff --git a/openhis-ui-vue3/src/store/modules/user.js b/openhis-ui-vue3/src/store/modules/user.js index b1bf55ea..3d78ba00 100644 --- a/openhis-ui-vue3/src/store/modules/user.js +++ b/openhis-ui-vue3/src/store/modules/user.js @@ -4,96 +4,96 @@ import defAva from '@/assets/images/user.png' import {defineStore} from 'pinia' const useUserStore = defineStore( - 'user', - { - state: () => ({ - token: getToken(), - id: '', - name: '', - avatar: '', - orgId: '', - practitionerId: '', - orgName: '', - nickName: '', - fixmedinsCode: '', // 医疗机构编码 - roles: [], - permissions: [], - tenantId: '', - tenantName: '', // 租户名称 - hospitalName:'', - optionMap: {} // 租户配置项Map(从sys_tenant_option表读取) - }), - actions: { - // 登录 - login(userInfo) { - const username = userInfo.username.trim() - const password = userInfo.password - const code = userInfo.code - const uuid = userInfo.uuid - const tenantId = userInfo.tenantId - return new Promise((resolve, reject) => { - login(username, password, code, uuid ,tenantId).then(res => { - setToken(res.token) - this.token = res.token - this.tenantId = tenantId - resolve() - }).catch(error => { - reject(error) + 'user', + { + state: () => ({ + token: getToken(), + id: '', + name: '', + avatar: '', + orgId: '', + practitionerId: '', + orgName: '', + nickName: '', + fixmedinsCode: '', // 医疗机构编码 + roles: [], + permissions: [], + tenantId: '', + tenantName: '', // 租户名称 + hospitalName:'', + optionMap: {} // 租户配置项Map(从sys_tenant_option表读取) + }), + actions: { + // 登录 + login(userInfo) { + const username = userInfo.username.trim() + const password = userInfo.password + const code = userInfo.code + const uuid = userInfo.uuid + const tenantId = userInfo.tenantId + return new Promise((resolve, reject) => { + login(username, password, code, uuid ,tenantId).then(res => { + setToken(res.token) + this.token = res.token + this.tenantId = tenantId + resolve() + }).catch(error => { + reject(error) + }) }) - }) - }, - // 获取用户信息 - getInfo() { - return new Promise((resolve, reject) => { - getInfo().then(res => { - const user = res.user - const avatar = (user.avatar == "" || user.avatar == null) ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar; + }, + // 获取用户信息 + getInfo() { + return new Promise((resolve, reject) => { + getInfo().then(res => { + const user = res.user + const avatar = (user.avatar == "" || user.avatar == null) ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar; - if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 - this.roles = res.roles - this.permissions = res.permissions - } else { - this.roles = ['ROLE_DEFAULT'] - } - // console.log('user info:', user); - this.id = user.userId - this.name = user.userName // 用户账号(对应数据库的user_name字段,如'admin') - this.orgId = user.orgId - this.orgName = user.orgName - this.nickName = user.nickName - this.practitionerId = res.practitionerId - this.fixmedinsCode = res.optionJson.fixmedinsCode - this.avatar = avatar - this.optionMap = res.optionMap || {} - // 优先从optionMap获取配置,如果没有则从optionJson获取 - this.hospitalName = this.optionMap.hospitalName || res.optionJson.hospitalName || '' - this.tenantName = res.tenantName || '' + if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 + this.roles = res.roles + this.permissions = res.permissions + } else { + this.roles = ['ROLE_DEFAULT'] + } + // console.log('user info:', user); + this.id = user.userId + this.name = user.userName // 用户账号(对应数据库的user_name字段,如'admin') + this.orgId = user.orgId + this.orgName = user.orgName + this.nickName = user.nickName + this.practitionerId = res.practitionerId + this.fixmedinsCode = res.optionJson.fixmedinsCode + this.avatar = avatar + this.optionMap = res.optionMap || {} + // 优先从optionMap获取配置,如果没有则从optionJson获取 + this.hospitalName = this.optionMap.hospitalName || res.optionJson.hospitalName || '' + this.tenantName = res.tenantName || '' - resolve(res) - }).catch(error => { - reject(error) + resolve(res) + }).catch(error => { + reject(error) + }) }) - }) - }, - // 退出系统 - logOut() { - return new Promise((resolve, reject) => { - logout(this.token).then(() => { - this.token = '' - this.roles = [] - this.permissions = [] - this.tenantId = '' - removeToken() - resolve() - }).catch(error => { - reject(error) + }, + // 退出系统 + logOut() { + return new Promise((resolve, reject) => { + logout(this.token).then(() => { + this.token = '' + this.roles = [] + this.permissions = [] + this.tenantId = '' + removeToken() + resolve() + }).catch(error => { + reject(error) + }) }) - }) - }, - removeRoles(){ - this.roles = [] + }, + removeRoles(){ + this.roles = [] + } } - } - }) + }) export default useUserStore diff --git a/openhis-ui-vue3/src/template/DischargeDiagnosisCertificate.vue b/openhis-ui-vue3/src/template/DischargeDiagnosisCertificate.vue index d2ac605b..6a523999 100644 --- a/openhis-ui-vue3/src/template/DischargeDiagnosisCertificate.vue +++ b/openhis-ui-vue3/src/template/DischargeDiagnosisCertificate.vue @@ -5,7 +5,7 @@ patient?.busNo || '未知' }} -

长春市朝阳区中医院

+

{{ userStore.hospitalName }}

出院诊断病历

@@ -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', diff --git a/openhis-ui-vue3/src/template/ProgressNoteform.vue b/openhis-ui-vue3/src/template/ProgressNoteform.vue index 2c9501fc..ff071869 100644 --- a/openhis-ui-vue3/src/template/ProgressNoteform.vue +++ b/openhis-ui-vue3/src/template/ProgressNoteform.vue @@ -1,5 +1,8 @@ + + + ${printContent.innerHTML} + + + `); + + printWindow.document.close(); + + // 等待内容加载完成后打印 + printWindow.onload = function() { + setTimeout(() => { + printWindow.print(); + // 打印后关闭窗口(可选) + // printWindow.close(); + }, 250); + }; +} + +// 选择挂号记录 +function handleRecordSelect(row) { + selectedRecord.value = row; +} + +// 确认选择记录 +async function handleConfirmSelect() { + if (!selectedRecord.value) { + proxy.$modal.msgWarning('请选择一条挂号记录'); + return; + } + + loading.value = true; + selectDialogVisible.value = false; + + try { + // 保存当前记录,用于打印 + currentRecord.value = selectedRecord.value; + + // 填充表单 - 确保数据正确填充 + fillForm(selectedRecord.value); + + // 等待一小段时间,确保 form 数据已更新 + await new Promise(resolve => setTimeout(resolve, 50)); + + // 验证表单数据是否已正确填充 + if (!form.encounterId) { + proxy.$modal.msgError('获取挂号记录ID失败,请重试'); + loading.value = false; + return; + } + + // 提交补打操作(handleSubmit 内部会管理 loading 状态) + await handleSubmit(); + } catch (error) { + console.error('确认选择记录失败:', error); + proxy.$modal.msgError('处理失败: ' + (error.message || '未知错误')); + loading.value = false; +} +} + +.print-section { + margin-bottom: 20px; +} + +.section-title { + font-size: 14px; + font-weight: bold; + margin-bottom: 10px; + border-bottom: 1px solid #ddd; + padding-bottom: 5px; +} + +.info-row { + margin-bottom: 8px; + font-size: 13px; +} + +.info-row .label { + display: inline-block; + width: 100px; + font-weight: bold; +} + +.info-row .value { + display: inline-block; +} + +.fee-table { + width: 100%; + border-collapse: collapse; + margin-top: 10px; +} + +.fee-table th, +.fee-table td { + border: 1px solid #ddd; + padding: 8px; + text-align: left; +} + +.fee-table th { + background-color: #f5f5f5; + font-weight: bold; +} + +.total-label { + font-weight: bold; + text-align: right; +} + +.total-value { + font-weight: bold; + color: red; +} + +/* 流水号显示在左下角,加粗 */ +.serial-number-bottom-left { + position: absolute; + bottom: 20px; + left: 20px; + font-size: 14px; + font-weight: bold; +} + +.serial-number-bottom-left .serial-label { + font-weight: bold; + margin-right: 5px; +} + +.serial-number-bottom-left .serial-value { + font-weight: bold; + color: #333; +} + +.print-content { + position: relative; + min-height: 500px; + padding-bottom: 60px; /* 为左下角流水号留出空间 */ +} + +.print-footer { + margin-top: 20px; + font-size: 12px; + color: #666; +} + +.reminder { + text-align: center; + padding: 10px; + background-color: #f9f9f9; + border-radius: 4px; +} + +.qr-code-section { + margin-top: 20px; + display: flex; + justify-content: center; + align-items: center; + padding: 15px; +} + +.qr-code-container { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; +} + +#qrcode { + display: flex; + justify-content: center; + align-items: center; +} + +.qr-code-label { + font-size: 12px; + color: #666; + text-align: center; +} + +@media print { + .qr-code-section { + page-break-inside: avoid; + } +} + diff --git a/openhis-ui-vue3/src/views/charge/outpatientregistration/index.vue b/openhis-ui-vue3/src/views/charge/outpatientregistration/index.vue index c1d5180b..2d127da2 100644 --- a/openhis-ui-vue3/src/views/charge/outpatientregistration/index.vue +++ b/openhis-ui-vue3/src/views/charge/outpatientregistration/index.vue @@ -4,9 +4,9 @@ @@ -649,6 +639,7 @@ import patientList from './components/patientList'; import {nextTick, onMounted, onUnmounted, ref} from 'vue'; import ChargeDialog from './components/chargeDialog.vue'; import RefundDialog from './components/refundDialog.vue'; +import ReprintDialog from './components/reprintDialog.vue'; import {handleColor} from '@/utils/his'; import useUserStore from '@/store/modules/user'; import {formatDateStr} from '@/utils/index'; @@ -709,6 +700,7 @@ const patientInfoList = ref(undefined); const contractList = ref(undefined); // const locationOptions = ref(undefined); // 地点树选项 const doctorList = ref(undefined); // 医生选项 +const allDoctorList = ref(undefined); // 所有医生选项(用于过滤) const healthcareList = ref([]); // 挂号项目选项 const orgOptions = ref(undefined); // 科室选项 const readCardLoading = ref(false); @@ -740,7 +732,6 @@ const data = reactive({ contractNo: [{ required: true, message: '费用性质', trigger: 'blur' }], patientId: [{ required: true, message: '病人不能为空', trigger: 'blur' }], priorityEnum: [{ required: true, message: '优先级不能为空', trigger: 'blur' }], - serviceTypeId: [{ required: true, message: '挂号类型不能为空', trigger: 'blur' }], organizationId: [{ required: true, message: '优先级不能为空', trigger: 'blur' }], orgId: [{ required: true, message: '就诊科室不能为空', trigger: 'blur' }], practitionerId: [{ required: true, message: '医生不能为空', trigger: 'blur' }], @@ -810,10 +801,10 @@ const { queryParams, form, rules } = toRefs(data); /** 根据contractNo获取费用性质名称 */ function getFeeTypeName(contractNo) { - if (!contractNo || !medfee_paymtd_code || !Array.isArray(medfee_paymtd_code)) { + if (!contractNo || !medfee_paymtd_code?.value || !Array.isArray(medfee_paymtd_code.value)) { return ''; } - const dictItem = medfee_paymtd_code.find(item => item.value === contractNo); + const dictItem = medfee_paymtd_code.value.find(item => item.value === contractNo); return dictItem ? dictItem.label : ''; } @@ -990,6 +981,24 @@ async function handleReadCard(value) { // } } +/** 跳转到患者档案页面 */ +function goToPatientRecord() { + // 如果已选择患者,则跳转到档案页面并定位到该患者 + if (form.value.patientId) { + // 使用患者ID作为查询参数传递到档案页面 + router.push({ + path: '/patient/patientmgr', + query: { + patientId: form.value.patientId, + patientName: form.value.name + } + }); + } else { + // 未选择患者时,直接跳转到档案页面 + router.push('/patient/patientmgr'); + } +} + /** 新增用户信息弹窗 */ function handleAddPatient() { proxy.$refs['patientAddRef'].show(); // 确保子组件更新后再调用 show 方法 @@ -1014,6 +1023,15 @@ function setInfo() { form.value.doctorName = doctorData.length > 0 ? doctorData[0].name : ''; } +// 挂号类型选择变化处理 +function handleServiceTypeChange() { + setchargeItem(); + // 如果已选择科室和医生,重新过滤医生列表 + if (form.value.orgId && allDoctorList.value) { + filterDoctorsByHealthcare(); + } +} + // 设定费用项管理表单 function setchargeItem() { if (healthcareList.value.length > 0) { @@ -1026,6 +1044,13 @@ function setchargeItem() { form.value.totalPrice = healthcareData.length > 0 ? healthcareData[0].price + healthcareData[0].activityPrice : ''; form.value.definitionId = healthcareData.length > 0 ? healthcareData[0].definitionId : ''; + } else { + // 如果没有挂号类型数据,清空相关字段 + form.value.locationId_dictText = ''; + form.value.price = ''; + form.value.activityPrice = ''; + form.value.totalPrice = ''; + form.value.definitionId = ''; } } /** 查询患者信息 */ @@ -1036,10 +1061,18 @@ function getList() { outpatientRegistrationList.value = res.data.records; total.value = res.data.total; - // 调试:查看返回的数据结构(仅退号记录查询时) - if (queryType.value === 'returned' && res.data.records && res.data.records.length > 0) { - console.log('退号记录数据结构:', res.data.records[0]); + // 调试:查看返回的数据结构,查找就诊卡号字段 + if (res.data.records && res.data.records.length > 0) { + console.log('当日已挂号数据结构:', res.data.records[0]); console.log('所有字段:', Object.keys(res.data.records[0])); + // 查找可能的就诊卡号字段 + const firstRecord = res.data.records[0]; + const possibleCardFields = ['identifierNo', 'cardNo', 'card', 'patientCardNo', 'identifier', 'medicalCardNo']; + possibleCardFields.forEach(field => { + if (firstRecord[field] !== undefined) { + console.log(`找到可能的就诊卡号字段 ${field}:`, firstRecord[field]); + } + }); } }); } @@ -1152,7 +1185,7 @@ function filterDoctorsByHealthcare() { } // 获取选中的挂号类型信息 - const selectedHealthcare = healthcareList.value.find( + const selectedHealthcare = healthcareList.value?.find( (healthcare) => healthcare.id === form.value.serviceTypeId ); @@ -1316,7 +1349,7 @@ function handleAdd() { genderEnum_enumText: form.value.genderEnum_enumText, age: form.value.age, contractName: form.value.contractNo - ? contractList.value.find((item) => item.busNo === form.value.contractNo)?.contractName || + ? contractList.value?.find((item) => item.busNo === form.value.contractNo)?.contractName || '自费' : '自费', idCard: form.value.idCard, @@ -1471,7 +1504,7 @@ function transformFormData(form) { patientId: form.patientId, definitionId: form.definitionId, serviceId: form.serviceTypeId, - totalPrice: form.price, // 默认值为 99.99 + totalPrice: form.totalPrice, // 使用正确的总价字段 }, }; } diff --git a/openhis-ui-vue3/src/views/clinicmanagement/bargain/component/prescriptionlist.vue b/openhis-ui-vue3/src/views/clinicmanagement/bargain/component/prescriptionlist.vue index fb0424a0..e7efd7e9 100644 --- a/openhis-ui-vue3/src/views/clinicmanagement/bargain/component/prescriptionlist.vue +++ b/openhis-ui-vue3/src/views/clinicmanagement/bargain/component/prescriptionlist.vue @@ -449,6 +449,10 @@ function handleDiagnosisChange(item, row) { function handleFocus(row, index) { rowIndex.value = index; + // 如果当前行已选择adviceType,同步到adviceQueryParams + if (row.adviceType !== undefined) { + adviceQueryParams.value.adviceType = row.adviceType; + } row.showPopover = true; } diff --git a/openhis-ui-vue3/src/views/clinicmanagement/dayEnd/index.vue b/openhis-ui-vue3/src/views/clinicmanagement/dayEnd/index.vue index d43fe8e6..790b0c83 100644 --- a/openhis-ui-vue3/src/views/clinicmanagement/dayEnd/index.vue +++ b/openhis-ui-vue3/src/views/clinicmanagement/dayEnd/index.vue @@ -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) diff --git a/openhis-ui-vue3/src/views/clinicmanagement/dayEnd/indexccu.vue b/openhis-ui-vue3/src/views/clinicmanagement/dayEnd/indexccu.vue index 9a2c2e6d..adb0889c 100644 --- a/openhis-ui-vue3/src/views/clinicmanagement/dayEnd/indexccu.vue +++ b/openhis-ui-vue3/src/views/clinicmanagement/dayEnd/indexccu.vue @@ -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, '打印机列表'); diff --git a/openhis-ui-vue3/src/views/clinicmanagement/disposal/index.vue b/openhis-ui-vue3/src/views/clinicmanagement/disposal/index.vue index 309e40dc..de262b3f 100644 --- a/openhis-ui-vue3/src/views/clinicmanagement/disposal/index.vue +++ b/openhis-ui-vue3/src/views/clinicmanagement/disposal/index.vue @@ -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, diff --git a/openhis-ui-vue3/src/views/clinicmanagement/historicalPrescription/component/prescription.vue b/openhis-ui-vue3/src/views/clinicmanagement/historicalPrescription/component/prescription.vue index 509a48f4..ed63b83a 100644 --- a/openhis-ui-vue3/src/views/clinicmanagement/historicalPrescription/component/prescription.vue +++ b/openhis-ui-vue3/src/views/clinicmanagement/historicalPrescription/component/prescription.vue @@ -27,7 +27,7 @@ CF0000000001
-

长春市朝阳区中医院医院

+

{{ userStore.hospitalName }}

处方单

@@ -130,7 +130,9 @@ @@ -729,12 +742,14 @@ const onHospitalization = async () => { .disabled-wrapper .overlay { position: absolute; - top: 0; + top: 50px; left: 0; width: 100%; - height: 100%; + height: calc(100% - 50px); z-index: 999; - /* 确保覆盖在内容上方 */ + /* 确保覆盖在内容上方,但不覆盖顶部按钮区域 */ cursor: not-allowed; + background-color: rgba(255, 255, 255, 0.01); + pointer-events: auto; } diff --git a/openhis-ui-vue3/src/views/drug/inpatientMedicationDispensing/components/MedicationDetails.vue b/openhis-ui-vue3/src/views/drug/inpatientMedicationDispensing/components/MedicationDetails.vue index bc1c6ff9..7d04dea3 100644 --- a/openhis-ui-vue3/src/views/drug/inpatientMedicationDispensing/components/MedicationDetails.vue +++ b/openhis-ui-vue3/src/views/drug/inpatientMedicationDispensing/components/MedicationDetails.vue @@ -291,10 +291,13 @@ import {advicePrint, getAdjustPriceSwitchState, lotNumberMatch} from '@/api/publ import {debounce} from 'lodash-es'; import TraceNoDialog from '@/components/OpenHis/TraceNoDialog/index.vue'; import {hiprint} from 'vue-plugin-hiprint'; -// import templateJson from './components/templateJson.json'; -// import disposalTemplate from './components/disposalTemplate.json'; +import templateJson from './templateJson.json'; +import disposalTemplate from './disposalTemplate.json'; import {formatInventory} from '@/utils/his.js'; +import useUserStore from '@/store/modules/user'; + +const userStore = useUserStore(); const { proxy } = getCurrentInstance(); const showSearch = ref(true); const total = ref(0); @@ -444,7 +447,9 @@ async function printPrescription() { }).then((res) => { if (projectTypeCode.value == '3') { 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, @@ -474,7 +479,9 @@ async function printPrescription() { prescriptionList: item, }); }); - 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, { height: 210, diff --git a/openhis-ui-vue3/src/views/hospitalRecord/components/admissionRecord.vue b/openhis-ui-vue3/src/views/hospitalRecord/components/admissionRecord.vue index adc95f03..9c7818fc 100644 --- a/openhis-ui-vue3/src/views/hospitalRecord/components/admissionRecord.vue +++ b/openhis-ui-vue3/src/views/hospitalRecord/components/admissionRecord.vue @@ -2,7 +2,7 @@
-
长春市朝阳区中医院
+
{{ userStore.hospitalName }}
- 本记录由长春市朝阳区中医院医师根据患者病情如实记录,仅供临床诊疗参考 | + 本记录由{{ userStore.hospitalName }}医师根据患者病情如实记录,仅供临床诊疗参考 | 地址:长春市朝阳区XX街XX号 | 联系电话:0431-XXXXXXX
@@ -629,7 +629,9 @@ \ No newline at end of file diff --git a/openhis-ui-vue3/src/views/hospitalRecord/components/intOperRecordSheet.vue b/openhis-ui-vue3/src/views/hospitalRecord/components/intOperRecordSheet.vue index 416fc596..92880ace 100644 --- a/openhis-ui-vue3/src/views/hospitalRecord/components/intOperRecordSheet.vue +++ b/openhis-ui-vue3/src/views/hospitalRecord/components/intOperRecordSheet.vue @@ -11,7 +11,7 @@ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.03); " > -
长春市朝阳区中医院
+
{{ userStore.hospitalName }}
-
长春市朝阳区中医院
+
{{ userStore.hospitalName }}
住院病案首页
@@ -1754,7 +1754,11 @@ diff --git a/openhis-ui-vue3/src/views/pharmacymanagement/westernmedicine/index.vue b/openhis-ui-vue3/src/views/pharmacymanagement/westernmedicine/index.vue index 34b7b0ad..c490fb86 100644 --- a/openhis-ui-vue3/src/views/pharmacymanagement/westernmedicine/index.vue +++ b/openhis-ui-vue3/src/views/pharmacymanagement/westernmedicine/index.vue @@ -696,7 +696,10 @@ async function printPrescription() { console.log('药房result', result); // 根据药品分类选择对应的打印模板 - const printElements = tcmFlag.value === '1' ? chineseMedicineTemplateJson : templateJson; + const template = tcmFlag.value === '1' ? chineseMedicineTemplateJson : templateJson; + const printElements = JSON.parse( + JSON.stringify(template).replace(/{{HOSPITAL_NAME}}/g, proxy.$store.useUserStore().hospitalName) + ); var hiprintTemplate = new hiprint.PrintTemplate({template: printElements}); // 定义模板 hiprintTemplate.print2(result, { height: 210, diff --git a/openhis-ui-vue3/src/views/surgerymanage/index.vue b/openhis-ui-vue3/src/views/surgerymanage/index.vue index 0778d025..c499e0b4 100644 --- a/openhis-ui-vue3/src/views/surgerymanage/index.vue +++ b/openhis-ui-vue3/src/views/surgerymanage/index.vue @@ -32,7 +32,7 @@ - + - + - + - + - + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + @@ -139,6 +195,11 @@ + + + + + @@ -147,23 +208,52 @@ - + +
* 编辑模式下患者信息不可更改
- - - + + + + +
+ 原就诊记录: {{ form.encounterNo || '无' }} +
+
+
+
+ + + + + + + + + + @@ -171,12 +261,12 @@ - + - + @@ -184,9 +274,9 @@ - + - + - + + + @@ -232,24 +330,24 @@ - + - + @@ -259,24 +357,24 @@ - + - + @@ -286,21 +384,21 @@ - + - + - - - + + + @@ -329,6 +439,8 @@ placeholder="请选择执行科室" check-strictly style="width: 100%" + :disabled="isViewMode" + @change="handleOrgChange" /> @@ -337,35 +449,35 @@ 诊断信息 - + - + - + - + - + - + - + @@ -373,9 +485,9 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - +
- - - - {{ viewData.surgeryNo }} - - {{ viewData.statusEnum_dictText }} - - {{ viewData.patientName }} - {{ viewData.patientGender }} / {{ viewData.patientAge }}岁 - {{ viewData.encounterNo }} - {{ viewData.surgeryName }} - {{ viewData.surgeryCode }} - {{ viewData.surgeryTypeEnum_dictText }} - {{ viewData.surgeryLevel_dictText }} - {{ viewData.anesthesiaTypeEnum_dictText }} - {{ viewData.plannedTime }} - {{ viewData.actualStartTime }} - {{ viewData.actualEndTime }} - {{ viewData.bodySite }} - {{ viewData.mainSurgeonName }} - {{ viewData.anesthetistName }} - {{ viewData.assistant1Name }} - {{ viewData.assistant2Name }} - {{ viewData.operatingRoomName }} - {{ viewData.orgName }} - {{ viewData.preoperativeDiagnosis }} - {{ viewData.postoperativeDiagnosis }} - ¥{{ viewData.surgeryFee }} - ¥{{ viewData.anesthesiaFee }} - ¥{{ viewData.totalFee }} - {{ viewData.remark }} - -