Przeglądaj źródła

电子病历本地缓存,和MDT弹窗

xiaochan 1 rok temu
rodzic
commit
cdbf538a31

+ 1 - 1
src/App.vue

@@ -117,7 +117,6 @@ function systemNotification(data) {
 }
 
 onMounted(() => {
-
   setCallback('refreshToken', (data) => {
     useUserStore().setToken(data.token)
   })
@@ -155,5 +154,6 @@ onMounted(() => {
   margin: 0;
   font-size: 14px;
   line-height: 1;
+  white-space: pre-wrap;
 }
 </style>

+ 1 - 1
src/components/cy/dialog/src/useCyDialog.ts

@@ -28,7 +28,7 @@ export const CyDialogProps = {
     },
     bodyHeight: {
         type: [Number, String],
-        default: '500px'
+        default: 'max-content'
     },
     bodyWidth: {
         type: [Number, String],

+ 1 - 0
src/layout/function-list/Message.vue

@@ -317,6 +317,7 @@ i {
   font-size: 16px;
   font-weight: bold;
   color: #303133;
+  white-space: pre-wrap;
 }
 
 .system-message-footer {

+ 2 - 1
src/layout/index.vue

@@ -18,7 +18,8 @@ const layouts: any = {
 }
 
 const pageName = computed(() => {
-  return useSystemStore().userConfig.layOutPageName
+  // return useSystemStore().userConfig.layOutPageName
+  return 'filletLayout'
 })
 const userStore = useUserStore()
 const router = useRouter()

+ 2 - 0
src/local-storage.d.ts

@@ -18,6 +18,8 @@ interface Storage {
      * 用户 token
      */
     token: string | null
+
+    emrCache: string | null
 }
 
 declare var localStorage: Storage;

+ 13 - 3
src/utils/emr/edit.ts

@@ -61,14 +61,24 @@ interface ElementByValue extends HTMLElement {
 
 export declare type EditType = {
 
-    ModelService: any,
-
     isRevisionMode: boolean;
 
     documentData: {
-        _id: string
+        _id: string,
+        categoryId: string
     }
 
+    _cacheDB: IDBTransaction;
+
+    loadCacheData: (val: string) => any
+    delCacheData: (val: string) => any
+
+    setCacheData: (val: string) => any
+
+    openCache: () => void
+
+    _cacheDBIsOpen: boolean;
+
     on: (name: string, callback: (...args: any[]) => void) => void
 
     /**

+ 43 - 6
src/utils/emr/emr-init-v2.ts

@@ -5,8 +5,11 @@ import {BizException, ExceptionEnum} from "../BizException";
 import {ElMessageBox} from "element-plus";
 import XEUtils from "xe-utils";
 import useDialogToJs from "@/components/js-dialog-comp/useDialogToJs";
+import {magicApi} from "@/utils/database/magic-api-request";
 
-const GenerateSignature = defineAsyncComponent(() => import("@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/components/GenerateSignature.vue"))
+const GenerateSignature = defineAsyncComponent(() =>
+    import("@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/components/GenerateSignature.vue"))
+const DialogDMT = defineAsyncComponent(() => import('@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/components/DialogMDT.vue'))
 
 type AppContext =
     | any
@@ -229,23 +232,57 @@ export function useEmrInit(
     })
 }
 
-export function componentClick(evt, comp, patientData): void {
-    const componentType = comp.componentType;
+export function componentClick(evt, view, patientData): void {
+    const componentType = view.componentType;
+    const eleInfo = view.getAttribute('element')
     if (componentType === 'sign') {
-        const eleInfo = comp.getAttribute('element')
         if (eleInfo.code.internal === '授权签名') {
             useDialogToJs(GenerateSignature, {
                 usersign: patientData['自动签名'][0]
             }).then(res => {
                 res.signature = "http://172.16.32.167:8077/doctorSignatureImage/" + res.id + '.png'
-                comp.sign([res])
+                view.sign([res])
             })
         }
 
         if (eleInfo.code.business === '自动签名') {
-            comp.sign(patientData['自动签名'])
+            view.sign(patientData['自动签名'])
         }
     }
+
+    if (eleInfo?.code?.internal === 'MDT') {
+        useHandleMdt(evt, view, patientData)
+    }
+}
+
+let mdtData = []
+
+async function useHandleMdt(evt, view, patientData) {
+    if (mdtData.length === 0) {
+        mdtData = await magicApi({
+            url: '/dataEmr/comp/mdtData',
+            method: 'get',
+        })
+    }
+
+    let value = view.value
+
+    if (XEUtils.isArray(value)) {
+        value = XEUtils.eachAndReturnList(value, (item) => {
+            return item.cascader
+        })
+    } else {
+        value = []
+    }
+
+    useDialogToJs(DialogDMT, {
+        options: mdtData,
+        value: value
+    }).then(res => {
+        view.setValue(res)
+        view.value = res
+        console.log(res)
+    });
 }
 
 export function getBcjlUserInfo(value: any):

+ 1 - 0
src/views/data-base/page-editor-help-v2/page-help-v2.ts

@@ -118,6 +118,7 @@ export function usePageStore(props: any) {
             return
         }
 
+        console.log(clone.paramsDefaultValue, clone.params)
         if (Object.keys(clone.paramsDefaultValue).length !== Object.keys(clone.params).length) {
             defaultValue()
             xcMessage.error('有新增的组件没有创建默认值。')

+ 100 - 79
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/EmrMain.vue

@@ -122,6 +122,7 @@
 <script setup lang="ts">
 import {nextTick, onDeactivated, onMounted, provide, ref, watch} from "vue";
 import {
+  copyAsDataSource,
   copyEnum,
   delEmrCopy,
   emrConfig,
@@ -180,6 +181,9 @@ import {
   useHistoricalData
 } from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/components/emr-function/useEmrFunction";
 import PatientInfoView from "@/components/zhu-yuan-yi-sheng/public/PatientInfoView.vue";
+import {
+  useEmrCache
+} from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/useEmrCache/useEmrCache";
 
 const EmrWebSocket = defineAsyncComponent(() =>
     import("@/components/zhu-yuan-yi-sheng/emr/web-socket/EmrWebSocket.vue"))
@@ -216,13 +220,13 @@ let runtime: Runtime | null = null
 let editMain: UseEmrInitReturn | null = null
 let extractData = {}
 
-const emrStore: PageStore = useEmrStore()
+const emrStore: PageStore = useEmrStore(patientInfo.value.inpatientNo + '_' + patientInfo.value.admissTimes)
 
 // 恢复到上一次保存的状态
 const {openRecovery} = useHistoricalData();
 
 provide(emrRootContextKey, {
-  store: emrStore
+  store: emrStore,
 })
 
 const {magicScript, triggerScript, scriptLoading} = useEmrScript({
@@ -320,8 +324,6 @@ const emrEvent = {
     // 设置病程记录跳转
     setTheProgressAnchor()
     maleDeleteDataElement()
-    // 是否开启审阅模式
-    isRevisionMode()
     // 判断是否只读
     readonlyPattern()
     // 每一个病历只能一个人编辑
@@ -774,29 +776,32 @@ const whetherThereIsAMedicalRecordId = () => {
   }
 }
 
-const checkEmrChange = (cb) => {
-  if (readonlyPattern()) {
-    isEditorChange.value = false
-  }
-  if (isEditorChange.value) {
-    CyMessageBox.confirm({
-      message: '您改变了数据是否要保存,不保存可能会丢失数据。',
-      title: '提示',
-      type: 'warning',
-      cancelButtonText: '放弃修改',
-      confirmButtonText: '保存病历',
-    }).then(() => {
-      clickSaveData()
-    }).catch(({action}) => {
-      if (action === 'cancel') {
-        isEditorChange.value = false
-        cb()
-      }
-    })
-  } else {
-    isEditorChange.value = false
-    cb()
-  }
+const checkEmrChange = () => {
+  return new Promise((resolve, reject) => {
+    if (readonlyPattern()) {
+      isEditorChange.value = false
+    }
+    if (isEditorChange.value) {
+      CyMessageBox.confirm({
+        message: '您改变了数据是否要保存,不保存可能会丢失数据。',
+        title: '提示',
+        type: 'warning',
+        cancelButtonText: '放弃修改',
+        confirmButtonText: '保存病历',
+      }).then(() => {
+        clickSaveData()
+        return reject()
+      }).catch(({action}) => {
+        if (action === 'cancel') {
+          isEditorChange.value = false
+          return resolve()
+        }
+      })
+    } else {
+      isEditorChange.value = false
+      return resolve()
+    }
+  })
 }
 
 const createName = ref('')
@@ -913,8 +918,10 @@ const 入院病历 = 'ruyuanjiluzhuanyong'
 function generalMedicalRecords() {
   if (emrEditCreateLimit.isEdit(createId)) {
     setEditorModel('free')
+    editor?.setRevisionShowMode(1);
   } else {
     setEditorModel('readonly')
+    editor?.setRevisionShowMode(2);
   }
 }
 
@@ -960,12 +967,16 @@ const setEditorModeFun = () => {
  */
 const openTheTraceByUser = (editorCode) => {
   if (readonlyPattern() || stringIsBlank(createId)) {
+    editor!.setRevisionMode('off')
+    editor!.setRevisionShowMode(1);
     return
   }
   if (editorCode === userInfo.code) {
     editor!.setRevisionMode('off')
+    editor!.setRevisionShowMode(1);
   } else {
     editor!.setRevisionMode('on')
+    editor!.setRevisionShowMode(2);
     xcMessage.warning('当前病历创建人不是您,你的操作将会留痕。')
   }
 }
@@ -1139,15 +1150,6 @@ const extractFields = (val) => {
   }
 }
 
-// 是否开启审阅模式
-const isRevisionMode = () => {
-  try {
-    editor!.setRevisionShowMode(reviewMode.value);
-  } catch (e) {
-    console.error(e)
-  }
-}
-
 // 电子病历排序
 const diseaseCourseSequencing = () => {
   if (!isCourse()) {
@@ -1160,8 +1162,8 @@ const diseaseCourseSequencing = () => {
       fn: function () {
         const areas = [];        //区域数组
         let walker = null;        //遍历器
-        const service = editor.ModelService; //节点工具
-        const root = editor.model.document.getRoot(); //文档跟节点
+        const service = editor!.ModelService; //节点工具
+        const root = editor!.model.document.getRoot(); //文档跟节点
         for (const node of root.getChildren()) { //遍历区域并把时间和区域关键放进areas
           if (node.type === 'area') {
             if (!walker) {
@@ -1283,9 +1285,10 @@ const currentEditorFunc = XEUtils.debounce(() => {
     getCurrentDocumentUserCode(getId()).then(res => {
       if (res && userInfo.code !== res.code) {
         const str = `当前编辑人员:【${res.name}】,科室:【${res.deptName}】<br /><span style="color: red">一份病历只能一个人编辑,当前病历已被锁定。</span>`
-        ElMessageBox.alert(str, '提示', {
+        CyMessageBox.alert({
+          message: str,
           dangerouslyUseHTMLString: true,
-          type: "warning"
+          type: 'warning'
         }).then(() => {
 
         }).catch(() => {
@@ -1339,11 +1342,9 @@ const fragmentJump = (param: EmrParam) => {
 
 const restoreDefaultSettings = () => {
   try {
-    editor!.setRevisionMode('off')
     editor!.setCursor('DOCUMENT_START')
     editMain?.iframe
-        .contentWindow
-        .document
+        .contentWindow!.document
         .getElementById('editorEl')
         .scroll({top: 0})
   } catch {
@@ -1351,39 +1352,61 @@ const restoreDefaultSettings = () => {
 }
 
 const loadDocument = (param: EmrParam): Promise<void> => {
-  return new Promise((resolve, reject) => {
+  return new Promise(async (resolve, reject) => {
     const {loadDocument: load} = editMain
     if (!(showIframeIsList(IframeTabs.正在编辑, IframeTabs.同时打开))) {
       showIframe.value = IframeTabs.正在编辑
     }
     if (emrConfig.value.loadDocument) {
-      resolve()
+      reject()
       return
     }
     if (param.documentId && getId() === param.documentId) {
       resolve()
       return;
     }
-    checkEmrChange(() => {
-      emrConfig.value.loadDocument = true
-      restoreDefaultSettings()
-      load(param).then((res) => {
-        isEmpty = false
-        templateName.value = param.templateName
-        categoryCode.value = param.categoryCode
-        createId = param.createId
-        parent = param.parent;
-        createName.value = param.createName
-        editor!.setDocument(res, true);
-        emrMitt.emit('changeRightTabs', isCourse() ? EmrRightTabs.fragment : EmrRightTabs.outline)
-        resolve()
-      }).catch((_err) => {
-        emptyEditor()
-        reject()
-      }).finally(() => {
-        emrConfig.value.loadDocument = false
-      })
+
+    function setValue() {
+      isEmpty = false
+      templateName.value = param.templateName as string
+      categoryCode.value = param.categoryCode as string
+      createId = param.createId
+      parent = param.parent;
+      createName.value = param.createName as string
+      emrMitt.emit('changeRightTabs', isCourse() ? EmrRightTabs.fragment : EmrRightTabs.outline)
+    }
+
+    await checkEmrChange()
+
+    emrConfig.value.loadDocument = true
+    restoreDefaultSettings()
+
+    const cacheData = await emrStore.cache.reduction({
+      id: param.documentId,
+      categoryId: param.categoryId
+    }).then(() => {
+      setValue()
+      emrConfig.value.loadDocument = false
+      return true
+    }).catch(() => {
+      return false
     })
+
+    if (cacheData) {
+      return
+    }
+
+    load(param).then((res) => {
+      setValue()
+      editor!.setDocument(res, true);
+      resolve()
+    }).catch((_err) => {
+      emptyEditor()
+      reject()
+    }).finally(() => {
+      emrConfig.value.loadDocument = false
+    });
+
   })
 }
 
@@ -1409,9 +1432,9 @@ const emrMittInit = () => {
     } else {
       showIframe.value = IframeTabs.已保存病历
     }
-    hisSaveEmr.loadDocument({documentId: id}).then(res => {
-      hisSaveEmr.editor?.setDocument(res, true);
-      hisSaveEmr.editor?.setEditorMode('readonly')
+    hisSaveEmr!.loadDocument({documentId: id}).then(res => {
+      hisSaveEmr!.editor?.setDocument(res, true);
+      hisSaveEmr!.editor?.setEditorMode('readonly')
     })
   })
   emrMitt.on('jumpDataElementById', (id: string) => {
@@ -1494,6 +1517,7 @@ const initEdit = () => {
     editMain = res
     popupFunc.setShortcutKey()
     setEditor();
+    emrStore.cache.open();
   })
 }
 
@@ -1505,7 +1529,7 @@ const hisSaveEmrInit = () => {
 }
 
 
-let hisSaveEmr: UseEmrInitReturn | {} = {}
+let hisSaveEmr: UseEmrInitReturn | null = null
 
 onMounted(async () => {
   doctorLevelFunc()
@@ -1523,21 +1547,19 @@ onDeactivated(() => {
   window.removeEventListener('beforeunload', monitorPageRefresh, {capture: true})
 })
 
-onBeforeRouteLeave((to, from, next) => {
-  checkEmrChange(() => {
-    next();
-  })
+onBeforeRouteLeave(async (to, from, next) => {
+  await checkEmrChange()
+  next()
 })
 
-
 const closeBothSides = () => {
   foldBothSides.value.isLeft = false
   foldBothSides.value.isRight = false
 }
 
 const closeWebSocket = () => {
-  emrSocketRef.value.clearDocument()
-  emrSocketRef.value.clearSocket()
+  emrSocketRef.value!.clearDocument()
+  emrSocketRef.value!.clearSocket()
 }
 
 const changeClear = () => {
@@ -1624,9 +1646,9 @@ const 解析病程记录 = (val) => {
 }
 
 const 循环病程返回数据元 = (callback) => {
-  const root = editor.model.document.getRoot()
+  const root = editor!.model.document.getRoot()
   let walker, values;
-  const modelService = editor.ModelService;
+  const modelService = editor!.ModelService;
   for (let node of root.getChildren()) {
     if (node.view && node.type === 'area') {
       if (!walker) {
@@ -1694,6 +1716,7 @@ async function handleCrb() {
   }
 }
 
+
 function selectFill() {
   setDialogToJs(ChooseToFillInData, {data: extractData}).then(res => {
     if (res.length === 0) {
@@ -1704,8 +1727,6 @@ function selectFill() {
   })
 }
 
-
-
 defineExpose({
   closeBothSides,
   closeWebSocket,

+ 61 - 0
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/components/DialogMDT.vue

@@ -0,0 +1,61 @@
+<script setup lang="ts">
+import CyDialog from "@/components/cy/dialog/src/CyDialog.vue";
+
+const props = defineProps<{
+  options: any[],
+  value: string[]
+}>()
+
+const modelValue = ref(props.value)
+
+function confirmClick(next) {
+  const reslut = []
+  modelValue.value.forEach(item => {
+    const {value, label} = getLastLevelData(props.options, item)
+    const tmp = {
+      cascader: item,
+      code: value,
+      name: label,
+      showExtraDisplay: label
+    }
+    reslut.push(tmp)
+  })
+  next(reslut)
+}
+
+
+function getLastLevelData(treeData, valueArray) {
+  let currentNode = treeData;
+  for (let i = 0; i < valueArray.length; i++) {
+    const value = valueArray[i];
+    const childNode = currentNode.find(node => node.value === value);
+    if (!childNode) {
+      return null; // 如果找不到对应的节点,则返回null
+    }
+    if (i === valueArray.length - 1) {
+      return childNode; // 找到最后一级节点,返回该节点
+    }
+    currentNode = childNode.children;
+  }
+  return null; // 如果遍历完整个数组仍然找不到最后一级节点,返回null
+}
+
+
+</script>
+
+<template>
+  <CyDialog title="MDT人员"
+            :confirm-click="confirmClick">
+    <el-cascader
+        style="width: 100%"
+        :options="options"
+        :props="{multiple: true}"
+        v-model="modelValue"
+        :show-all-levels="false"
+    />
+  </CyDialog>
+</template>
+
+<style lang="scss">
+
+</style>

+ 26 - 8
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/components/emr-function/EmrFunctionList.vue

@@ -7,30 +7,39 @@ import {
   RefreshLeft,
   RefreshRight,
   SortDown,
-  Avatar
+  Avatar,
+  FolderChecked
 } from "@element-plus/icons-vue";
 import {
   emrConfig,
-  emrMitt, query,
+  emrMitt,
+  query,
   useRecoveryEmr
 } from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init";
 import {
   FunctionList,
   Button,
-  PopoverButton,
+  PopoverButton
 } from "./useEmrFunction";
 import {xcMessage} from "@/utils/xiaochan-element-plus";
+import {
+  emrRootContextKey
+} from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-func/useEmrStore";
 
-const props = defineProps<{
-  openRecovery: () => void,
-  isOpenPage: boolean,
+interface EmrFunctionListProps {
+  openRecovery: Function;
+  isOpenPage: boolean;
   reviewMode: number;
-}>()
+}
+
+const root = inject(emrRootContextKey)
+
+const props = defineProps<EmrFunctionListProps>()
+
 let zoom = 1;
 
 const emits = defineEmits(['update:isOpenPage', 'update:reviewMode'])
 
-
 function setRevisionShowMode(value: number) {
   emits('update:reviewMode', 2)
   emrMitt.emit('editor')?.setRevisionShowMode(2);
@@ -104,6 +113,15 @@ const functionList = ref<FunctionList[][]>([
       contextmenu() {
         emrMitt.emit('selectFill')
       },
+    },
+    {
+      title: window.indexedDB ? '病历暂存点击后页面刷新不会导致病历消失,重新打开病历会自动触发恢复的方法。' : '你的电脑不支持暂存',
+      iconfontName: <FolderChecked/>,
+      name: '暂存',
+      disabled: !window.indexedDB,
+      click() {
+        root?.store.cache.saveCache()
+      }
     }
   ],
   businessFunctions,

+ 1 - 6
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-init.ts

@@ -378,6 +378,7 @@ export interface EmrParam extends LoadParams {
     createName?: string,
     trueCreationTime?: string
     parent: string
+    categoryId: string
 }
 
 export interface Audit {
@@ -507,12 +508,6 @@ export function showIframeIsList(...val: number[]) {
     return val.includes(showIframe.value)
 }
 
-export const emrTitle: {
-    [key: string]: string
-} = {
-    "同步": '点击可以同步患者信息,从其他病历提取的数据元会强制替换,如入院诊断,患者的个人信息需要在病历中删除后才可以替换,右键可以选择性的强制替换数据元,如不需要填充入院诊断,可以取消勾选。'
-}
-
 export const useRecoveryEmr = () => {
     useDialogToJs(EmrRecycleBin, {
         patNo: query.value.patNo,

+ 100 - 4
src/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-func/useEmrStore.ts

@@ -1,7 +1,12 @@
 import {type InjectionKey, ref} from 'vue'
 import {EditType, Outline} from "@/utils/emr/edit";
+import {xcMessage} from "@/utils/xiaochan-element-plus";
+import {stringNotBlank} from "@/utils/blank-utils";
+import usePromise from "@/utils/cy-use/usePromise";
+import XEUtils from "xe-utils";
+import {CyMessageBox} from "@/components/cy/message-box";
 
-export const useEmrStore = () => {
+export const useEmrStore = (patId: string) => {
     const patInfo = ref({})
     const emrPatientData = ref({})
     const outline = ref<Outline[]>([])
@@ -19,6 +24,96 @@ export const useEmrStore = () => {
         },
     }
 
+    const cache = {
+        open() {
+            if (window.indexedDB) {
+                editor?.openCache()
+                xcMessage.success('您的电脑支持本地缓存')
+                return
+            }
+            xcMessage.error('您的电脑不支持缓存,请升级浏览器')
+        },
+        saveCache() {
+            if (editor == null) {
+                xcMessage.error('无法缓存,请等待页面加载完成');
+                return
+            }
+            if (!(editor!._cacheDBIsOpen)) {
+                xcMessage.error('您的电脑不支持缓存,请升级浏览器')
+                return;
+            }
+            let key = '';
+            if (stringNotBlank(editor?.documentData._id)) {
+                key = 'id-' + editor?.documentData._id
+            } else if (stringNotBlank(editor?.documentData.categoryId)) {
+                key = 'code-' + patId + '-' + editor?.documentData.categoryId
+            } else {
+                xcMessage.error('无法缓存,请先打开一个病历');
+                return
+            }
+            editor.setCacheData(key)
+            xcMessage.success('缓存成功,刷新后可恢复');
+        },
+        getAll(table = "docdata") {
+            const promise = usePromise<{ _key: string }[]>();
+
+            const transaction = editor!._cacheDB.db.transaction(table, "readwrite")
+            transaction.oncomplete = (event) => {
+                promise.resolve(event);
+            }
+            transaction.onerror = (event) => {
+                promise.reject(event)
+            }
+            let objectStore = transaction.objectStore(table);
+            objectStore.getAll().onsuccess = (event) => {
+                // @ts-ignore
+                const data = event.target.result;
+                if (XEUtils.isArray(data)) {
+                    promise.resolve(data);
+                } else {
+                    promise.reject(event)
+                }
+            }
+            return promise.promise
+        },
+        reduction({id, categoryId}: { id: string | null | undefined, categoryId: string }) {
+            return new Promise(async (resolve, reject) => {
+                const cacheData = await this.getAll().catch(() => []);
+                let key = "";
+                if (stringNotBlank(id)) {
+                    key = "id-" + id;
+                } else if (stringNotBlank(categoryId)) {
+                    key = 'code-' + patId + '-' + categoryId
+                }
+
+                function dialog(dataKey: string) {
+                    CyMessageBox.confirm({
+                        message: '监测到本地缓存是否使用缓存的数据',
+                        confirmButtonText: '使用',
+                        cancelButtonText: '不使用',
+                    }).then(() => {
+                        editor!.loadCacheData(dataKey)
+                        editor!.delCacheData(dataKey)
+                        resolve(true);
+                    }).catch(() => {
+                        reject(false)
+                    })
+                }
+
+                for (let i = 0; i < cacheData.length; i++) {
+                    const item = cacheData[i]
+                    if (item._key === key) {
+                        dialog(item._key)
+                        return
+                    }
+                }
+                reject(false)
+            })
+
+
+        },
+    }
+
     return {
         patInfo,
         emrPatientData,
@@ -27,19 +122,20 @@ export const useEmrStore = () => {
         outline,
         getEditor(): EditType {
             return (editor as EditType)
-        }
+        },
+        cache
     }
 }
 
 class HelperStore {
-    Return = useEmrStore()
+    Return = useEmrStore('')
 }
 
 type PageStore = HelperStore['Return']
 export type {PageStore}
 
 interface EmrRootContext {
-    store: PageStore
+    store: PageStore,
 }
 
 export const emrRootContextKey: InjectionKey<EmrRootContext> =