xiaochan il y a 1 an
Parent
commit
99849678d3

+ 3 - 39
src/App.vue

@@ -29,42 +29,8 @@ progressBarStore.initialize({
   abnormalClosing: false,
 })
 
-const emrChannelFunc = {
-  "firstPageOfMedicalRecord": (val) => {
-    router.push({
-      name: 'fillCaseFrontSheet',
-      query: {
-        patNo: val.inpatientNo,
-        deptCode: val.smallDept,
-      },
-    })
-  },
-  "medicalAdvice": (val) => {
-    router.push({
-      name: 'yiZhuLuRu',
-      params: {
-        inpatientNo: val.inpatientNo
-      },
-      query: {
-        pattern: 'all'
-      }
-    })
-  }
-}
-
-const createChannel = () => {
-  let homePage = new BroadcastChannel('emrChannel')
-  homePage.addEventListener('message', async (e) => {
-    if (!router.currentRoute.value.path.includes('/myEmrEditor')) {
-      await router.push('/blank')
-      let data = JSON.parse(e.data)
-      emrChannelFunc[data.name](data.data)
-    }
-  })
-}
 
 function avatarNotification(data) {
-
   const message = (
       <div>
         <div>
@@ -125,7 +91,6 @@ function checkTheCallbacks({data, isAdd}) {
 }
 
 function systemNotification(data) {
-  console.log(data)
   if (data.count) {
     systemStore.addUnreadMessageCount(data.count)
   }
@@ -141,18 +106,17 @@ function systemNotification(data) {
   }
 
   ElNotification({
-    title: typeof data.title === 'undefined' ? '新消息' : data.title,
+    title: data.title ?? '新消息',
     message: h('pre', {
       class: 'message_pre'
     }, data.message),
     dangerouslyUseHTMLString: true,
-    type: typeof data.type === 'undefined' ? 'warning' : data.type,
+    type: data.title ?? 'warning',
     duration: 0,
   })
 }
 
 onMounted(() => {
-  createChannel()
 
   setCallback('refreshToken', (data) => {
     useUserStore().setToken(data.token)
@@ -173,7 +137,7 @@ onMounted(() => {
       type: 'error',
       confirmButtonText: '前往处理',
       cancelButtonText: '关闭'
-    }).then(res => {
+    }).then(() => {
       router.push(`/inpatient/zhuYuanYiSheng/criticalValue?id=${data.id}`)
     }).catch(() => {
     })

+ 41 - 33
src/api/settings/user-settings.js

@@ -1,55 +1,63 @@
 import request from '../../utils/request'
 
 export function getUserInfo() {
-  return request({
-    url: '/settings/getUserInfo',
-    method: 'get',
-  })
+    return request({
+        url: '/settings/getUserInfo',
+        method: 'get',
+    })
 }
 
 export function changePassword(data) {
-  return request({
-    url: '/settings/changePassword',
-    method: 'post',
-    data,
-  })
+    return request({
+        url: '/settings/changePassword',
+        method: 'post',
+        data,
+    })
 }
 
 export function getMyAdvices() {
-  return request({
-    url: '/settings/getMyAdvices',
-    method: 'get',
-  })
+    return request({
+        url: '/settings/getMyAdvices',
+        method: 'get',
+    })
 }
 
 export function submitNewAdvice(data) {
-  return request({
-    url: '/settings/submitNewAdvice',
-    method: 'post',
-    data,
-  })
+    return request({
+        url: '/settings/submitNewAdvice',
+        method: 'post',
+        data,
+    })
 }
 
 export function checkAdvice(id) {
-  return request({
-    url: '/settings/checkAdvice',
-    method: 'get',
-    params: { id },
-  })
+    return request({
+        url: '/settings/checkAdvice',
+        method: 'get',
+        params: {id},
+    })
 }
 
 export function updateReply(data) {
-  return request({
-    url: '/settings/replyAdvice',
-    method: 'post',
-    data,
-  })
+    return request({
+        url: '/settings/replyAdvice',
+        method: 'post',
+        data,
+    })
 }
 
 export function dismissUserBadge(id) {
-  return request({
-    url: '/settings/dismissUserBadge',
-    method: 'get',
-    params: { id },
-  })
+    return request({
+        url: '/settings/dismissUserBadge',
+        method: 'get',
+        params: {id},
+    })
+}
+
+export function setUserConfig(data) {
+    return request({
+        url: '/settings/setUserConfig',
+        method: 'post',
+        data: {userConfig: data},
+    });
 }

+ 2 - 2
src/components/fullScreen/fullPage/FullScreenFirstPage.vue

@@ -61,7 +61,7 @@ import {useSystemStore} from "@/pinia/system-store";
 
 const systemStore = useSystemStore()
 const collapsed = computed(() => {
-  return systemStore.isCollapse
+  return systemStore.userConfig.isCollapse
 })
 watch(
   () => collapsed.value,
@@ -167,4 +167,4 @@ watch(
     height: 50%;
   }
 }
-</style>
+</style>

+ 12 - 13
src/components/xiao-chan/progress-bar/ProgressBar.vue

@@ -1,11 +1,10 @@
 <template>
-    <el-dialog v-model="dialog" title="进度">
-        <el-progress :percentage="percentage"/>
-    </el-dialog>
+  <el-dialog v-model="dialog" title="进度">
+    <el-progress :percentage="percentage"/>
+  </el-dialog>
 </template>
 
 <script setup name='ProgressBar'>
-
 import {setCallback} from "@/utils/websocket";
 import {makePercentage} from "@/components/progress/progUtils";
 import sleep from "@/utils/sleep";
@@ -14,15 +13,15 @@ const percentage = ref(0)
 const dialog = ref(false)
 
 onMounted(() => {
-    setCallback('emrRule', (data) => {
-        dialog.value = true
-        percentage.value = makePercentage(data.currentIndex, data.count)
-        if (percentage.value === 100) {
-            sleep(1000).then(() => {
-                dialog.value = false
-            })
-        }
-    });
+  setCallback('emrRule', (data) => {
+    dialog.value = true
+    percentage.value = makePercentage(data.currentIndex, data.count)
+    if (percentage.value === 100) {
+      sleep(1000).then(() => {
+        dialog.value = false
+      })
+    }
+  });
 })
 </script>
 

+ 4 - 5
src/components/zhu-yuan-yi-sheng/emr/web-socket/EmrWebSocket.vue

@@ -34,6 +34,7 @@ import {
 } from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/force-refresh-func";
 import {useUserStore} from "@/pinia/user-store";
 import {isDev} from "@/utils/public";
+import {CyMessageBox} from "@/components/cy/message-box";
 
 const props = defineProps<{
   patInfo: {
@@ -217,16 +218,13 @@ const initDocumentSocket = () => {
     if (e.code === 1000 && e.reason === '服务器主动断开连接') {
       documentSocket = null
       emrMitt.emit('setEditorReadonly');
-      ElMessageBox.alert('服务器主动断开连接,有医生把您踢下线', '提示', {
-        type: 'warning'
-      }).then(() => {
-      }).catch(() => {
+      CyMessageBox.alert({
+        message: '服务器主动断开连接,有医生把您踢下线'
       })
       return
     }
     initDocumentSocket()
   }
-
 }
 
 
@@ -249,6 +247,7 @@ onMounted(async () => {
   await nextTick()
   initWebSocket(props.patInfo.inpatientNo, props.patInfo.admissTimes)
   emrMitt.on('getDocumentSocket', () => {
+    console.log(documentSocket)
     return documentSocket;
   })
   emrMitt.on('openChatRoom', () => {

+ 1 - 1
src/layout/compoents/CollapseIcon.vue

@@ -3,7 +3,7 @@ import {Expand, Fold} from "@element-plus/icons-vue";
 import {useSystemStore} from "@/pinia/system-store";
 
 const systemStore = useSystemStore()
-const isCollapse = computed(() => systemStore.isCollapse)
+const isCollapse = computed(() => systemStore.userConfig.isCollapse)
 const switchCollapse = () => {
   systemStore.setCollapse(!isCollapse.value)
 }

+ 1 - 2
src/layout/fillet-layout/index.vue

@@ -31,10 +31,9 @@ import {useSystemStore} from "@/pinia/system-store";
 import {useUserStore} from "@/pinia/user-store";
 import FilletAside from "@/layout/fillet-layout/FilletAside.vue";
 
-
 const systemStore = useSystemStore()
 const userStore = useUserStore()
-const isCollapse = computed(() => systemStore.isCollapse)
+const isCollapse = computed(() => systemStore.userConfig.isCollapse)
 
 const hideMenu = () => {
   systemStore.setCollapse(true)

+ 92 - 45
src/layout/function-list/Theme.vue

@@ -1,61 +1,97 @@
 <template>
-  <div @click="drawer = true">
+  <div @click="openDrawer">
     <div title="系统设置">
       <i class="sfont system-shezhi"></i>
     </div>
 
-    <el-drawer v-model="drawer" title="系统设置" class="herder_height">
-      <el-switch
-          active-text="圆角布局"
-          inactive-text="常见布局"
-          active-value="filletLayout"
-          inactive-value="defaultLayout"
-          @change="pageNameChange"
-          v-model="pageName"
-      />
+    <el-drawer v-model="drawer" title="系统设置" class="system_user-config">
+
       <el-collapse v-model="activeNames">
-        <el-collapse-item title="菜单配置" name="0">
+        <el-collapse-item title="医嘱录入" name="0">
           <el-form>
-            <el-form-item label="侧边菜单栏背景色">
-              <el-color-picker v-model="theme['--el-menu-bg-color']"/>
+            <el-form-item :label="`默认查询【${userConfig.yz_orderTimeDay}】天前医嘱`">
+              <el-input-number
+                  :min="1"
+                  v-model="userConfig.yz_orderTimeDay"/>
             </el-form-item>
-
-            <el-form-item label="侧边菜单文字颜色">
-              <el-color-picker v-model="theme['--el-menu-text-color']"/>
-            </el-form-item>
-
-            <el-form-item label="侧边菜单激活项背景色">
-              <el-color-picker v-model="theme['--el-menu-active-color']"/>
+            <el-form-item label="医嘱排序">
+              <el-select v-model="userConfig.yz_orderBySort">
+                <xc-el-option :data="[{code: 'asc' , name : '正序'},{code: 'desc' , name : '反序'}]"/>
+              </el-select>
             </el-form-item>
           </el-form>
         </el-collapse-item>
-
-        <el-collapse-item title="顶部配置" name="1">
+        <el-collapse-item title="系统配置" name="1">
           <el-form>
-            <el-form-item label="激活菜单背景颜色">
-              <el-color-picker v-model="theme['--xc-header-active-bg-color']"/>
+            <el-form-item label="布局">
+              <el-switch
+                  active-text="圆角布局"
+                  inactive-text="常见布局"
+                  active-value="filletLayout"
+                  inactive-value="defaultLayout"
+                  v-model="userConfig.layOutPageName"
+              />
             </el-form-item>
-
-            <el-form-item label="激活菜单文字颜色">
-              <el-color-picker v-model="theme['--xc-header-active-text-color']"/>
-            </el-form-item>
-          </el-form>
-        </el-collapse-item>
-
-        <el-collapse-item title="按钮配置" name="2">
-          <el-form>
-            <el-form-item label="默认按钮颜色">
-              <el-color-picker v-model="theme['--el-color-primary']"/>
+            <el-form-item label="侧边栏">
+              <el-switch
+                  active-text="收起"
+                  inactive-text="展开"
+                  :active-value="true"
+                  :inactive-value="false"
+                  v-model="userConfig.isCollapse"
+              />
             </el-form-item>
           </el-form>
         </el-collapse-item>
+        <!--        <el-collapse-item title="菜单配置" name="0">-->
+        <!--          <el-form>-->
+        <!--            <el-form-item label="侧边菜单栏背景色">-->
+        <!--              <el-color-picker v-model="theme['&#45;&#45;el-menu-bg-color']"/>-->
+        <!--            </el-form-item>-->
+
+        <!--            <el-form-item label="侧边菜单文字颜色">-->
+        <!--              <el-color-picker v-model="theme['&#45;&#45;el-menu-text-color']"/>-->
+        <!--            </el-form-item>-->
+
+        <!--            <el-form-item label="侧边菜单激活项背景色">-->
+        <!--              <el-color-picker v-model="theme['&#45;&#45;el-menu-active-color']"/>-->
+        <!--            </el-form-item>-->
+        <!--          </el-form>-->
+        <!--        </el-collapse-item>-->
+
+        <!--        <el-collapse-item title="顶部配置" name="1">-->
+        <!--          <el-form>-->
+        <!--            <el-form-item label="激活菜单背景颜色">-->
+        <!--              <el-color-picker v-model="theme['&#45;&#45;xc-header-active-bg-color']"/>-->
+        <!--            </el-form-item>-->
+
+        <!--            <el-form-item label="激活菜单文字颜色">-->
+        <!--              <el-color-picker v-model="theme['&#45;&#45;xc-header-active-text-color']"/>-->
+        <!--            </el-form-item>-->
+        <!--          </el-form>-->
+        <!--        </el-collapse-item>-->
+
+        <!--        <el-collapse-item title="按钮配置" name="2">-->
+        <!--          <el-form>-->
+        <!--            <el-form-item label="默认按钮颜色">-->
+        <!--              <el-color-picker v-model="theme['&#45;&#45;el-color-primary']"/>-->
+        <!--            </el-form-item>-->
+        <!--          </el-form>-->
+        <!--        </el-collapse-item>-->
       </el-collapse>
+      <template #footer>
+        <el-button size="large" type="primary" @click="saveUserConfig">保存</el-button>
+      </template>
     </el-drawer>
   </div>
 </template>
 
-<script setup name="Theme">
+<script setup lang="ts">
 import {theme} from "@/theme";
+import {SystemConfig, useSystemStore} from "@/pinia/system-store";
+import XEUtils from 'xe-utils'
+import {Ref, ref} from "vue";
+import XcElOption from "@/components/xiao-chan/xc-el-option/XcElOption.vue";
 
 const tabsHook = {
   setItem: function (val) {
@@ -66,8 +102,25 @@ const tabsHook = {
   },
 }
 
+const systemStore = useSystemStore()
 const drawer = ref(false)
 const activeNames = ref(['0', '1', '2'])
+const userConfig: Ref<SystemConfig> = ref({
+  isCollapse: false,
+  layOutPageName: 'filletLayout',
+  yz_orderBySort: 'asc',
+  yz_orderTimeDay: 90,
+})
+
+function openDrawer() {
+  userConfig.value = XEUtils.clone(systemStore.userConfig, true)
+  drawer.value = true
+}
+
+function saveUserConfig() {
+  systemStore.postUserConfig(userConfig.value)
+  drawer.value = false
+}
 
 watch(() => theme.value, () => {
   const el = document.documentElement
@@ -78,12 +131,6 @@ watch(() => theme.value, () => {
 }, {deep: true})
 
 
-const pageName = ref(localStorage.pageName)
-
-function pageNameChange(val) {
-  localStorage.pageName = val
-}
-
 onMounted(() => {
   const el = document.documentElement
   for (let key in theme.value) {
@@ -98,9 +145,9 @@ onMounted(() => {
 
 </script>
 
-<style lang="scss" scoped>
-.herder_height {
-  :deep(.el-drawer__header ) {
+<style lang="scss">
+.system_user-config {
+  .el-drawer__header {
     margin-bottom: 10px !important;
   }
 }

+ 4 - 2
src/layout/index.vue

@@ -10,14 +10,16 @@ import {uuid} from "@/utils/getUuid";
 import {useUserStore} from "@/pinia/user-store";
 import {stringNotBlank} from "@/utils/blank-utils";
 import {CyMessageBox} from "@/components/cy/message-box";
-import filletLayout from './fillet-layout/index.vue'
+import {useSystemStore} from "@/pinia/system-store";
 
 const layouts: any = {
   filletLayout: defineAsyncComponent(() => import('./fillet-layout/index.vue')),
   defaultLayout: defineAsyncComponent(() => import('./default-layout/index.vue'))
 }
 
-const pageName = localStorage.pageName ?? 'filletLayout'
+const pageName = computed(() => {
+  return useSystemStore().userConfig.layOutPageName
+})
 const userStore = useUserStore()
 const router = useRouter()
 

+ 26 - 13
src/pinia/system-store.ts

@@ -1,23 +1,34 @@
 import {defineStore} from 'pinia';
 import {useLocalStorage} from "@vueuse/core";
+import XEUtils from "xe-utils";
+// @ts-ignore
+import {setUserConfig} from "@/api/settings/user-settings";
 
 declare interface systemAttr {
     theme: object,
-    isCollapse: boolean,
-    expandOneMenu: boolean,
-    elementSize: string,
     unreadMessageCount: number,
     systemMessages: string[],
     hospitalCode: string,
     systemName: string,
+    userConfig: SystemConfig
+}
+
+export interface SystemConfig {
+    isCollapse: boolean;
+    layOutPageName: 'defaultLayout' | 'filletLayout';
+    yz_orderBySort: 'desc' | 'asc';
+    yz_orderTimeDay: number | 90;
 }
 
 export const useSystemStore = defineStore('system', {
     state: () => useLocalStorage<systemAttr>('systemStore', ({
+        userConfig: {
+            isCollapse: true,
+            layOutPageName: 'filletLayout',
+            yz_orderBySort: 'asc',
+            yz_orderTimeDay: 90,
+        },
         theme: {},  // 主题
-        isCollapse: true, // 侧边栏是否收缩展示
-        expandOneMenu: true, // 一次是否只能展开一个菜单
-        elementSize: 'small', // element默认尺寸
         unreadMessageCount: 0, // 未查看的消息数量
         systemMessages: [], // 已经看过的系统通知id
         hospitalCode: 'H43010500370',
@@ -25,21 +36,23 @@ export const useSystemStore = defineStore('system', {
     })).value,
     getters: {
         getCollapse: (state): boolean => {
-            return state.isCollapse
+            return state.userConfig.isCollapse
         },
         getSystemMessages: (state): string[] => {
             return state.systemMessages
         },
     },
     actions: {
-        setCollapse(val: boolean) {
-            this.isCollapse = val
+        setConfig(val: any) {
+            this.userConfig = XEUtils.assign(this.userConfig, val)
         },
-        setExpandOneMenu(val: boolean) {
-            this.expandOneMenu = val
+        postUserConfig(val: any) {
+            this.userConfig = val
+            setUserConfig(JSON.stringify(val)).then((_r: any) => {
+            })
         },
-        setElementSize(val: '' | 'default' | 'small' | 'large') {
-            this.elementSize = val
+        setCollapse(val: boolean) {
+            this.userConfig.isCollapse = val
         },
         setUnreadMessageCount(val: number) {
             this.unreadMessageCount = val

+ 4 - 4
src/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng.ts

@@ -16,8 +16,7 @@ import setDialogToJs from "@/components/js-dialog-comp/useDialogToJs";
 import YaoPingXiangQing from "@/components/zhu-yuan-yi-sheng/he-li-yong-yao/YaoPingXiangQing.vue";
 import cyRefList from "@/utils/cyRefList";
 import {reportQueryCenterApiByGet} from "@/api/base-data/report-center";
-import sleep from "@/utils/sleep";
-import {query} from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init";
+import {useSystemStore} from "@/pinia/system-store";
 
 export interface PatInfo {
     inpatientNo?: string | null
@@ -469,10 +468,11 @@ export const jsQueryYzData = async () => {
     }
 }
 
+const userConfig = useSystemStore().userConfig
 let newDate = ''
 getServerDate().then((res) => {
     newDate = res
-    const {start, end} = elDateRangeAddTime(aFewDaysAgo(res, 90));
+    const {start, end} = elDateRangeAddTime(aFewDaysAgo(res, userConfig.yz_orderTimeDay));
     queryParam.value.startTime = start;
     queryParam.value.endTime = end;
 })
@@ -481,7 +481,7 @@ getServerDate().then((res) => {
 export const queryParam = ref({
     displayRange: 2,
     frequCode: isDev ? frequCodeEnum.all : frequCodeEnum.longTerm,
-    sort: OrderBy.asc,
+    sort: userConfig.yz_orderBySort,
     zhuangTai: 0,
     groupNo: '73',
     patNo: '',

+ 7 - 2
src/views/system/login.vue

@@ -64,13 +64,17 @@ import ForgotPassword from "@/views/system/forgot-password/ForgotPassword.vue";
 import {loginApi} from "@/api/login";
 import {useUserStore} from "@/pinia/user-store";
 import router from "@/router";
+import {useSystemStore} from "@/pinia/system-store";
 
 const showPwd = ref(false)
 
+const systemConfig = useSystemStore()
+
 const form = reactive({
   codeRs: '',
   password: '',
 })
+
 const checkForm = () => {
   if (form.codeRs === '') {
     BizException(ExceptionEnum.MESSAGE_ERROR, '用户名不能为空')
@@ -78,7 +82,7 @@ const checkForm = () => {
   if (form.password === '') {
     BizException(ExceptionEnum.MESSAGE_ERROR, '密码不能为空')
   }
-}
+};
 
 const userStore = useUserStore()
 const submit = () => {
@@ -88,8 +92,9 @@ const submit = () => {
     password: form.password,
   }
   loginApi(params).then((res) => {
-    localStorage.clear()
+    localStorage.clear();
     userStore.setUserInfo(res)
+    systemConfig.setConfig(res.userConfigJson)
     if (!checkPasswordStrength(params.password) && !isDev) {
       changePassword(false).then(newPassword => {
         form.password = newPassword