xiaochan 1 rok pred
rodič
commit
0ed77c6bf7

+ 4 - 0
src/api/public-api.js

@@ -166,6 +166,10 @@ export function getSystemAnnouncement() {
     });
 }
 
+/**
+ *
+ * @return {Promise<String>}
+ */
 export function getUuid() {
     return request({
         url: '/publicApi/getUuid',

+ 0 - 1
src/components/xiao-chan/combo-grid/XcComboGridV2.vue

@@ -246,7 +246,6 @@ const handleBlur = () => {
       inputData.value = <string>props.modelValue;
     }
   }
-
 }
 
 const keyUp = () => {

+ 2 - 1
src/router/modules/dashboard.js

@@ -788,7 +788,8 @@ const route = [
                 meta: {title: '慢病信息登记'},
             },
             {
-                path: 'chronicDisease/chronicDiseaseQuestionnaire',
+                path: 'chronicDisease/chronicDiseaseQuestionnaire/:id?',
+                name: 'chronicDiseaseQuestionnaire',
                 component: createNameComponent(() => import('@/views/clinic/chronicDisease/ChronicDiseaseQuestionnaire.vue')),
                 meta: {title: '慢病调查问卷'},
             },

+ 1 - 1
src/utils/emr/edit.ts

@@ -15,7 +15,7 @@ interface Validator {
     message: string;
 }
 
-export type EditorMode = 'from' | 'free' | 'readonly' | 'design';
+export type EditorMode = 'form' | 'free' | 'readonly' | 'design';
 
 export interface DataElements {
     [key: string]: {

+ 5 - 2
src/utils/emr/emr-init-v2.ts

@@ -1,5 +1,5 @@
 import {EditType, Runtime} from './edit'
-import {UnwrapRef} from 'vue'
+import {onActivated, onUnmounted, UnwrapRef} from 'vue'
 import {BizException, ExceptionEnum} from "../BizException";
 import {ElMessageBox} from "element-plus";
 
@@ -107,8 +107,10 @@ export function useEmrInit(
     return new Promise((resolve, reject) => {
         // @ts-ignore
         if (div['emr']) {
-            throw new Error('该div已挂载请选择其他div')
+            div.querySelector('iframe').remove()
         }
+
+
         const iframe: HTMLIFrameElement = document.createElement('iframe')
         let editor: EditType, runtime: Runtime
 
@@ -123,6 +125,7 @@ export function useEmrInit(
         iframe.src = '/emr/runtime/#/editor' + additionalParameters
         iframe.style.border = '0'
 
+
         function loadDocument(loadParams: LoadParams): Promise<any> {
             return new Promise((resolve, reject) => {
                 runtime.loadDocument(

+ 379 - 342
src/views/clinic/chronicDisease/ChronicDiseaseQuestionnaire.vue

@@ -1,167 +1,169 @@
 <template>
-    <el-row :gutter="5" style="height: 100%;">
-        <el-col :span="8" style="height: auto;">
-            <PageLayer>
-                <template #main class="hd-cl">
-                    <el-row :gutter="5">
-                        <el-descriptions :column="2" border style="width:100%;">
-                            <el-descriptions-item label="门诊号" width="15%">
-                                {{ crmEmrPatientVo.hisMzNo }}
-                            </el-descriptions-item>
-                            <el-descriptions-item label="住院号" width="15%">
-                                {{ crmEmrPatientVo.hisZyNo }}
-                            </el-descriptions-item>
-                        </el-descriptions>
-                    </el-row>
-                    <el-row :gutter="5">
-                        <el-descriptions :column="1" border style="width:100%;">
-                            <el-descriptions-item label="证件号" width="30%">
-                                {{ crmEmrPatientVo.socialNo }}
-                            </el-descriptions-item>
-                        </el-descriptions>
-                    </el-row>
-                    <el-row :gutter="5">
-                        <el-descriptions :column="1" border style="width:100%;">
-                            <el-descriptions-item label="慢病类型" width="30%">
-                                {{ crmEmrPatientVo.chronicDiseaseName.substring(0,
-                                    crmEmrPatientVo.chronicDiseaseName.lastIndexOf(",")) }}
-                            </el-descriptions-item>
-                        </el-descriptions>
-                    </el-row>
-                    <el-row :gutter="5">
-                        <el-descriptions :column="2" border style="width:100%;">
-                            <el-descriptions-item label="姓名" width="15%">
-                                {{ crmEmrPatientVo.pName }}
-                            </el-descriptions-item>
-                            <el-descriptions-item label="病人来源" width="15%">
-                                {{ crmEmrPatientVo.ptName }}
-                            </el-descriptions-item>
-                        </el-descriptions>
-                    </el-row>
-                    <el-row :gutter="5">
-                        <el-descriptions :column="2" border style="width:100%;">
-                            <el-descriptions-item label="性别" width="15%">
-                                {{ crmEmrPatientVo.sexValue }}
-                            </el-descriptions-item>
-                            <el-descriptions-item label="年龄" width="15%">
-                                {{ crmEmrPatientVo.age === null ? '' : crmEmrPatientVo.age + '岁' }}
-                            </el-descriptions-item>
-                        </el-descriptions>
-                    </el-row>
-                    <el-row :gutter="5" style="padding-top: 5px;">
-                        <el-tabs type="border-card" v-model="tabType" @tab-click="queryCrmEmdrData" style="width:100%;">
-                            <el-tab-pane label="慢病模板" name="0">
-                                <el-table :data="emrTemplateData" @row-click="rowClick">
-                                    <el-table-column type="index" label="序号" width="50"></el-table-column>
-                                    <el-table-column label="名称" prop="name"></el-table-column>
-                                </el-table>
-                            </el-tab-pane>
-                            <el-tab-pane label="修改模板" name="2">
-                                <div style="width: 100%;">
-                                    <el-input v-model="num" placeholder="回访次数" style="width: 60%;">
-                                        <template #prepend>回访次数</template>
-                                    </el-input>
-                                    <el-button type="primary" icon="Search" @click="callEditCrmEmr(2)"
-                                        style="margin-left: 10px">查询
-                                    </el-button>
-                                </div>
-                                <el-table :data="emrTemplateEditData" @row-click="rowClick">
-                                    <el-table-column type="index" label="序号" width="50"></el-table-column>
-                                    <el-table-column label="名称" prop="name"></el-table-column>
-                                </el-table>
-                            </el-tab-pane>
-                            <el-tab-pane label="历史模板" name="3">
-                                <el-input v-model="filterText" placeholder="搜索" style="width: 100%;">
-                                    <template #prepend>关键字</template>
-                                </el-input>
-                                <el-tree style="width: 100%;" ref="treeRef" class="filter-tree" :data="treeData"
-                                    :props="defaultProps" @node-click="handleNodeClick" node-key="id" highlight-current
-                                    default-expand-all :filter-node-method="filterNode" />
-                            </el-tab-pane>
-                        </el-tabs>
-                    </el-row>
-                </template>
-            </PageLayer>
-        </el-col>
-        <el-col :span="16" style="height: auto;">
-            <PageLayer>
-                <template #header class="hd-cl">
-                    <el-input v-model="textCode" placeholder="请输入证件号/门诊号/住院号" style="width: 320px;">
-                        <template #prepend>关键字</template>
-                    </el-input>
-                    <el-button type="primary" icon="Search" @click="selectCrmPatientMiByCode" style="margin-left: 10px">查询
-                    </el-button>
-                    <el-button type="success" @click="saveData">保存</el-button>
-                    <el-button icon="Printer" type="primary" @click="handlePrint"> 打印</el-button>
-                </template>
-                <template #main>
-                    <div ref="emrDivRef" style="width: 100% ; height: 100%">
-                    </div>
-                </template>
-            </PageLayer>
-        </el-col>
-    </el-row>
+  <el-row :gutter="5" style="height: 100%;">
+    <el-col :span="8" style="height: auto;">
+      <PageLayer>
+        <template #main class="hd-cl">
+          <el-row :gutter="5">
+            <el-descriptions :column="2" border style="width:100%;">
+              <el-descriptions-item label="门诊号" width="15%">
+                {{ crmEmrPatientVo.hisMzNo }}
+              </el-descriptions-item>
+              <el-descriptions-item label="住院号" width="15%">
+                {{ crmEmrPatientVo.hisZyNo }}
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-row>
+          <el-row :gutter="5">
+            <el-descriptions :column="1" border style="width:100%;">
+              <el-descriptions-item label="证件号" width="30%">
+                {{ crmEmrPatientVo.socialNo }}
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-row>
+          <el-row :gutter="5">
+            <el-descriptions :column="1" border style="width:100%;">
+              <el-descriptions-item label="慢病类型" width="30%">
+                {{
+                  crmEmrPatientVo.chronicDiseaseName.substring(0,
+                      crmEmrPatientVo.chronicDiseaseName.lastIndexOf(","))
+                }}
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-row>
+          <el-row :gutter="5">
+            <el-descriptions :column="2" border style="width:100%;">
+              <el-descriptions-item label="姓名" width="15%">
+                {{ crmEmrPatientVo.pName }}
+              </el-descriptions-item>
+              <el-descriptions-item label="病人来源" width="15%">
+                {{ crmEmrPatientVo.ptName }}
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-row>
+          <el-row :gutter="5">
+            <el-descriptions :column="2" border style="width:100%;">
+              <el-descriptions-item label="性别" width="15%">
+                {{ crmEmrPatientVo.sexValue }}
+              </el-descriptions-item>
+              <el-descriptions-item label="年龄" width="15%">
+                {{ crmEmrPatientVo.age === null ? '' : crmEmrPatientVo.age + '岁' }}
+              </el-descriptions-item>
+            </el-descriptions>
+          </el-row>
+          <el-row :gutter="5" style="padding-top: 5px;">
+            <el-tabs type="border-card" v-model="tabType" class="small_tabs" @tab-click="queryCrmEmdrData"
+                     style="width:100%;">
+              <el-tab-pane label="慢病模板" name="0">
+                <el-table :data="emrTemplateData" @row-click="rowClick">
+                  <el-table-column type="index" label="序号" width="50"></el-table-column>
+                  <el-table-column label="名称" prop="name"></el-table-column>
+                </el-table>
+              </el-tab-pane>
+              <el-tab-pane label="修改模板" name="2">
+                <div style="width: 100%;">
+                  <el-input v-model="num" placeholder="回访次数" style="width: 60%;">
+                    <template #prepend>回访次数</template>
+                  </el-input>
+                  <el-button type="primary" icon="Search" @click="callEditCrmEmr(2)"
+                             style="margin-left: 10px">查询
+                  </el-button>
+                </div>
+                <el-table :data="emrTemplateEditData" @row-click="rowClick">
+                  <el-table-column type="index" label="序号" width="50"></el-table-column>
+                  <el-table-column label="名称" prop="name"></el-table-column>
+                </el-table>
+              </el-tab-pane>
+              <el-tab-pane label="历史模板" name="3">
+                <el-input v-model="filterText" placeholder="搜索" style="width: 100%;">
+                  <template #prepend>关键字</template>
+                </el-input>
+                <el-tree style="width: 100%;" ref="treeRef" class="filter-tree" :data="treeData"
+                         :props="defaultProps" @node-click="handleNodeClick" node-key="id" highlight-current
+                         default-expand-all :filter-node-method="filterNode"/>
+              </el-tab-pane>
+            </el-tabs>
+          </el-row>
+        </template>
+      </PageLayer>
+    </el-col>
+    <el-col :span="16" style="height: auto;">
+      <PageLayer>
+        <template #header class="hd-cl">
+          <el-input v-model="textCode" placeholder="请输入证件号/门诊号/住院号" style="width: 320px;">
+            <template #prepend>关键字</template>
+          </el-input>
+          <el-button type="primary" icon="Search" @click="selectCrmPatientMiByCode" style="margin-left: 10px">查询
+          </el-button>
+          <el-button type="success" @click="saveData">保存</el-button>
+          <el-button icon="Printer" type="primary" @click="handlePrint"> 打印</el-button>
+        </template>
+        <template #main>
+          <div ref="emrDivRef" style="width: 100% ; height: 100%">
+          </div>
+        </template>
+      </PageLayer>
+    </el-col>
+  </el-row>
 </template>
-<script setup lang="ts" name="ChronicDiseaseQuestionnaire">
-import { onMounted, ref, nextTick, watch } from "vue";
+<script setup lang="ts">
+import {onMounted, ref, nextTick, watch, onActivated, onUnmounted} from "vue";
 import PageLayer from '@/layout/PageLayer.vue'
-import { clone } from '@/utils/clone'
-import { useEmrInit, UseEmrInitReturn } from "@/utils/emr/emr-init-v2";
-import { getCrmEmrModel, queryCrmEmrTree, queryCrmPatientInfoByCode, saveCrmEmrModel } from "@/api/chronic-disease/chronic-disease-questionnaire";
-import { userInfoStore } from "@/utils/store-public";
-import { ElMessageBox, ElTree, ElMessage } from 'element-plus'
-import { stringIsBlank } from "@/utils/blank-utils";
-import { getServerDateApi, getUuid } from "@/api/public-api";
+import {clone} from '@/utils/clone'
+import {useEmrInit, UseEmrInitReturn} from "@/utils/emr/emr-init-v2";
+import {
+  getCrmEmrModel,
+  queryCrmEmrTree,
+  queryCrmPatientInfoByCode,
+  saveCrmEmrModel
+} from "@/api/chronic-disease/chronic-disease-questionnaire";
+import {userInfoStore} from "@/utils/store-public";
+import {ElMessageBox, ElTree, ElMessage} from 'element-plus'
+import {stringIsBlank} from "@/utils/blank-utils";
+import {getServerDateApi, getUuid} from "@/api/public-api";
+import router from "@/router";
+import {useCompRef} from "@/utils/useCompRef";
+import {onDeactivated} from "@vue/runtime-core";
 
 const textCode = ref('')
 const tabType = ref('0')
 const num = ref()
 
 const emrEvent = {
-    'contextUpdate': (evt, contextMap, component, context) => {
-        component.getAttribute('element')
-        if (component.getAttribute('element')) {
-        }
+  'contextUpdate': (evt, contextMap, component, context) => {
+    const element = component.getAttribute('element')
+    if (element) {
+      console.log(element.name)
     }
+  }
 }
 
-onMounted(async () => {
-
-    await nextTick(() => {
-        useEmrInit(emrDivRef.value, { appContext, event: emrEvent }).then((res: any) => {
-            editor = res
-        })
-
-        queryCrmEmdrData(null, null)
-    })
-})
 
 export interface Property {
-    editorVersion?: string;
-    creator?: string;
-    modifyTime?: string;
-    createTime?: string;
-    modifier?: string;
-    reviewer?: string;
-    reviewTime?: string;
+  editorVersion?: string;
+  creator?: string;
+  modifyTime?: string;
+  createTime?: string;
+  modifier?: string;
+  reviewer?: string;
+  reviewTime?: string;
 }
 
 export interface Version {
-    name?: string;
-    properties?: Property;
+  name?: string;
+  properties?: Property;
 }
 
 export interface emrTemplateType {
-    documentId?: string,
-    parent?: string;
-    code?: string;
-    versions?: Version[];
-    sortNumber?: number;
-    name?: string;
-    description?: string;
-    _id?: string;
-    type?: string;
-    labels?: string[];
+  documentId?: string,
+  parent?: string;
+  code?: string;
+  versions?: Version[];
+  sortNumber?: number;
+  name?: string;
+  description?: string;
+  _id?: string;
+  type?: string;
+  labels?: string[];
 }
 
 const emrTemplateData = ref<emrTemplateType[]>()
@@ -173,258 +175,293 @@ const categoryCode = ref<string>('')
 const mzEmrName = ref<string>('')
 const parent = ref<string>('')
 
-const rowClick = (row: emrTemplateType) => {
-    selectionStatus.value = true
-    editor.editor.setEditorMode('free')
-    categoryCode.value = row.code as string
-    mzEmrName.value = row.name as string
-    parent.value = row.parent as string
-    if (tabType.value == '0') {
-        editor.loadAndSetDocument({
-            categoryId: row._id,
-            categoryCode: row.code,
-        })
-    } else {
-        editor.loadAndSetDocument({
-            documentId: row.documentId
-        })
-    }
-
+const rowClick = async (row: emrTemplateType) => {
+  selectionStatus.value = true
+  categoryCode.value = row.code as string
+  mzEmrName.value = row.name as string
+  parent.value = row.parent as string
+  if (tabType.value == '0') {
+    await editor.loadAndSetDocument({
+      categoryId: row._id,
+      categoryCode: row.code,
+    })
+  } else {
+    await editor.loadAndSetDocument({
+      documentId: row.documentId
+    })
+  }
+  editor.editor.setEditorMode('form')
 }
 
 const saveData = () => {
-    if (!((tabType.value == '0' || tabType.value == '2') && selectionStatus.value)) {
-        return ElMessage.error('请选择数据,只有慢病模板才能保存!')
-    }
-    ElMessageBox.confirm('请确认是否保存', {
-        cancelButtonText: '取消',
-        confirmButtonText: '确定',
-    })
-        .then(() => {
-            clickSaveData()
-        })
-        .catch(() => {
-        })
+  if (!((tabType.value == '0' || tabType.value == '2') && selectionStatus.value)) {
+    return ElMessage.error('请选择数据,只有慢病模板才能保存!')
+  }
+  ElMessageBox.confirm('请确认是否保存', {
+    cancelButtonText: '取消',
+    confirmButtonText: '确定',
+  })
+      .then(() => {
+        clickSaveData()
+      })
+      .catch(() => {
+      })
 }
 
 const clickSaveData = async () => {
-    // 解析 id
-    let id = await analysisIframeSrcSearch()
-    let data: any = {
-        pId: crmEmrPatientVo.value.pId,
-        pType: crmEmrPatientVo.value.pType,
-        emrDocumentId: id,
-        emrCategoryCode: categoryCode.value,
-        visitTimes: tabType.value !== '2' ? crmEmrPatientVo.value.visitTimes : num.value,
-        emrName: mzEmrName.value,
-        name: mzEmrName.value,
-        parent: parent.value,
-        inputId: crmEmrPatientVo.value.userIdCode,
-        inputDept: crmEmrPatientVo.value.deptCode,
-        documentData: null
-    }
-    let newDate = await getServerDateApi();
-    const document = editor.editor.getDocument();
-
-    document.properties.categoryCode = data.emrCategoryCode
-    document.properties.patientId = data.pId + "-" + data.visitTimes;
-    document._id = data.emrDocumentId
-    data.documentData = document
-
-    if (document.properties.creator) {
-        document.properties.modifier = crmEmrPatientVo.value.userIdCode
-        document.properties.modifierId = crmEmrPatientVo.value.userName
-        document.properties.modifyTime = newDate
-    } else {
-        document.properties.creator = crmEmrPatientVo.value.userIdCode
-        document.properties.creatorId = crmEmrPatientVo.value.userName
-        document.properties.createTime = newDate
-    }
-    saveCrmEmrModel(data).then((res: any) => {
-        selectCrmPatientMiByCode()
-        queryCrmEmdrData(null, null)
-    })
+  // 解析 id
+  let id = await analysisIframeSrcSearch()
+  let data: any = {
+    pId: crmEmrPatientVo.value.pId,
+    pType: crmEmrPatientVo.value.pType,
+    emrDocumentId: id,
+    emrCategoryCode: categoryCode.value,
+    visitTimes: tabType.value !== '2' ? crmEmrPatientVo.value.visitTimes : num.value,
+    emrName: mzEmrName.value,
+    name: mzEmrName.value,
+    parent: parent.value,
+    inputId: crmEmrPatientVo.value.userIdCode,
+    inputDept: crmEmrPatientVo.value.deptCode,
+    documentData: null
+  }
+  let newDate = await getServerDateApi();
+  const document = editor.editor.getDocument();
+
+  document.properties.categoryCode = data.emrCategoryCode
+  document.properties.patientId = data.pId + "-" + data.visitTimes;
+  document._id = data.emrDocumentId
+  data.documentData = document
+
+  if (document.properties.creator) {
+    document.properties.modifier = crmEmrPatientVo.value.userIdCode
+    document.properties.modifierId = crmEmrPatientVo.value.userName
+    document.properties.modifyTime = newDate
+  } else {
+    document.properties.creator = crmEmrPatientVo.value.userIdCode
+    document.properties.creatorId = crmEmrPatientVo.value.userName
+    document.properties.createTime = newDate
+  }
+  saveCrmEmrModel(data).then((res: any) => {
+    selectCrmPatientMiByCode()
+    queryCrmEmdrData(null, null)
+  })
 
 }
 
 const analysisIframeSrcSearch = async () => {
-    let id = getId()
-    let temp: string
-    if (stringIsBlank(id)) {
-        // 这个是 唯一 id 调用服务的雪花算法
-        temp = await getUuid()
-    } else {
-        temp = id
-    }
-    return temp
+  let id = getId()
+  let temp: string
+  if (stringIsBlank(id)) {
+    // 这个是 唯一 id 调用服务的雪花算法
+    temp = await getUuid()
+  } else {
+    temp = id
+  }
+  return temp
 }
 
 const getId = () => {
-    if (editor) {
-        return editor.editor.documentData._id
-    }
-    return null
+  if (editor) {
+    return editor.editor.documentData._id
+  }
+  return null
 }
 
 
 const appContext = () => {
-    return {
-        endpoints: {
-            app: "/bdp/dataservice/api",
-            his: import.meta.env.VITE_BASE_URL,
-        },
-        input: {
-            user: userInfoStore.value.code,
-            name: userInfoStore.value.name
-        },
-        login: {
-            token: userInfoStore.value.token,
-            user: {
-                id: userInfoStore.value.code,
-                name: userInfoStore.value.name
-            }
-        },
-        data: {
-            '姓名': crmEmrPatientVo.value.pName,
-            '性别': [{ code: crmEmrPatientVo.value.sex, name: crmEmrPatientVo.value.sexValue }],
-            '年龄': crmEmrPatientVo.value.age,
-            '电话号码': crmEmrPatientVo.value.relTel,
-            '住址': crmEmrPatientVo.value.detailAdress,
-            '身份证号码': crmEmrPatientVo.value.socialNo,
-            '家属电话': crmEmrPatientVo.value.relNameTel,
-            '首次建卡时间': crmEmrPatientVo.value.createDate,
-            '随访医生': [{ code: crmEmrPatientVo.value.userIdCode, name: crmEmrPatientVo.value.userName }],
-        }
+  return {
+    endpoints: {
+      app: "/bdp/dataservice/api",
+      his: import.meta.env.VITE_BASE_URL,
+    },
+    input: {
+      user: userInfoStore.value.code,
+      name: userInfoStore.value.name
+    },
+    login: {
+      token: userInfoStore.value.token,
+      user: {
+        id: userInfoStore.value.code,
+        name: userInfoStore.value.name
+      }
+    },
+    data: {
+      '姓名': crmEmrPatientVo.value.pName,
+      '性别': [{code: crmEmrPatientVo.value.sex, name: crmEmrPatientVo.value.sexValue}],
+      '年龄': crmEmrPatientVo.value.age,
+      '电话号码': crmEmrPatientVo.value.relTel,
+      '住址': crmEmrPatientVo.value.detailAdress,
+      '身份证号码': crmEmrPatientVo.value.socialNo,
+      '家属电话': crmEmrPatientVo.value.relNameTel,
+      '首次建卡时间': crmEmrPatientVo.value.createDate,
+      '随访医生': [{code: crmEmrPatientVo.value.userIdCode, name: crmEmrPatientVo.value.userName}],
     }
+  }
 }
 
 const handlePrint = () => {
-    editor.editor.execute("print", {
-        value: {
-            showPreview: false,
-        }
-    })
+  editor.editor.execute("print", {
+    value: {
+      showPreview: false,
+    }
+  })
 }
 
 
 const crmEmrPatientVo = ref<any>({
-    pId: '',
-    pType: '',
-    hisMzNo: '',
-    hisZyNo: '',
-    visitTimes: null,
-    userIdCode: '',
-    userName: '',
-    deptCode: '',
-    deptName: '',
-    pName: '',
-    sex: '',
-    sexValue: '',
-    age: null,
-    relTel: '',
-    socialNo: '',
-    relNameTel: '',
-    chronicDiseaseName: '',
-    detailAdress: '',
-    createDate: '',
-    ptName: '',
-    type: null,
+  pId: '',
+  pType: '',
+  hisMzNo: '',
+  hisZyNo: '',
+  visitTimes: null,
+  userIdCode: '',
+  userName: '',
+  deptCode: '',
+  deptName: '',
+  pName: '',
+  sex: '',
+  sexValue: '',
+  age: null,
+  relTel: '',
+  socialNo: '',
+  relNameTel: '',
+  chronicDiseaseName: '',
+  detailAdress: '',
+  createDate: '',
+  ptName: '',
+  type: null,
 })
 
 const treeData = ref<Tree[]>()
 
 const selectCrmPatientMiByCode = () => {
-    queryCrmPatientInfoByCode(textCode.value).then((res: any) => {
-        crmEmrPatientVo.value = res
+  queryCrmPatientInfoByCode(textCode.value).then((res: any) => {
+    crmEmrPatientVo.value = res
+    router.push({
+      name: 'chronicDiseaseQuestionnaire',
+      query: {
+        id: textCode.value
+      }
     })
+  })
 }
 
 const queryCrmEmdrData = async (tab: any, event: any) => {
-    tabType.value = tab === null ? '0' : tab.props.name
-    let type = Number.parseInt(tabType.value)
-    selectionStatus.value = false
-    if (type == 0) {
-        await getCrmEmrModel().then((res: any) => {
-            let tem = [] as Array<emrTemplateType>
-            if (res) {
-                for (let i = 0; i < res.length; i++) {
-                    if (res[i].parent != null) {
-                        tem.push(res[i])
-                    }
-                }
-            }
-            emrTemplateData.value = tem
-        })
-    } else if (type == 2) {
-        callEditCrmEmr(type)
-    } else {
-        crmEmrPatientVo.value['type'] = type
-        queryCrmEmrTree(crmEmrPatientVo.value).then((res: any) => {
-            treeData.value = res
-        })
-    }
+  tabType.value = tab === null ? '0' : tab.props.name
+  let type = Number.parseInt(tabType.value)
+  selectionStatus.value = false
+  if (type == 0) {
+    await getCrmEmrModel().then((res: any) => {
+      let tem = [] as Array<emrTemplateType>
+      if (res) {
+        for (let i = 0; i < res.length; i++) {
+          if (res[i].parent != null) {
+            tem.push(res[i])
+          }
+        }
+      }
+      emrTemplateData.value = tem
+    })
+  } else if (type == 2) {
+    callEditCrmEmr(type)
+  } else {
+    crmEmrPatientVo.value['type'] = type
+    queryCrmEmrTree(crmEmrPatientVo.value).then((res: any) => {
+      treeData.value = res
+    })
+  }
 }
 
 const callEditCrmEmr = (type: any) => {
-    crmEmrPatientVo.value['type'] = type
-    let queryData = clone(crmEmrPatientVo.value)
-    if (!queryData.pId) {
-        ElMessage.error('请选择查询病人数据, 再查看慢病记录!')
-        return
-    }
-
-    queryData.visitTimes = num.value
-    queryCrmEmrTree(queryData).then((res: any) => {
-        let tempData = [] as any
-        if (res) {
-            for (let i = 0; i < res.length; i++) {
-                let te = {
-                    _id: '',
-                    categoryCode: '',
-                    documentId: '',
-                    name: '',
-                    cade: '',
-                    parent: '',
-                }
-                te.cade = res[i].emrCategoryCode
-                te.parent = res[i].parent
-                te.categoryCode = res[i].emrCategoryCode
-                te.documentId = res[i].emrDocumentId
-                te.name = res[i].name
-                tempData.push(te)
-            }
-            emrTemplateEditData.value = tempData
+  crmEmrPatientVo.value['type'] = type
+  let queryData = clone(crmEmrPatientVo.value)
+  if (!queryData.pId) {
+    ElMessage.error('请选择查询病人数据, 再查看慢病记录!')
+    return
+  }
+
+  queryData.visitTimes = num.value
+  queryCrmEmrTree(queryData).then((res: any) => {
+    let tempData = [] as any
+    if (res) {
+      for (let i = 0; i < res.length; i++) {
+        let te = {
+          _id: '',
+          categoryCode: '',
+          documentId: '',
+          name: '',
+          cade: '',
+          parent: '',
         }
-    })
+        te.cade = res[i].emrCategoryCode
+        te.parent = res[i].parent
+        te.categoryCode = res[i].emrCategoryCode
+        te.documentId = res[i].emrDocumentId
+        te.name = res[i].name
+        tempData.push(te)
+      }
+      emrTemplateEditData.value = tempData
+    }
+  })
 }
 
 interface Tree {
-    [key: string]: any
+  [key: string]: any
 }
 
 const filterText = ref('')
-const treeRef = ref<InstanceType<typeof ElTree>>()
+const treeRef = useCompRef(ElTree)
 
 const defaultProps = {
-    children: 'children',
-    label: 'name',
+  children: 'children',
+  label: 'name',
 }
 
 watch(filterText, (val) => {
-    treeRef.value!.filter(val)
+  treeRef.value!.filter(val)
 })
 
 const filterNode = (value: string, data: Tree) => {
-    if (!value) return true
-    return data.name.includes(value)
+  if (!value) return true
+  return data.name.includes(value)
 }
 
 const handleNodeClick = (node: any, object: any, event: any) => {
-    selectionStatus.value = true
-    editor.editor.setEditorMode('readonly')
-    editor.loadAndSetDocument({
-        documentId: node.emrDocumentId
-    })
+  selectionStatus.value = true
+  editor.editor.setEditorMode('readonly')
+  editor.loadAndSetDocument({
+    documentId: node.emrDocumentId
+  })
 }
 
-</script>
+let tempDocument = null
+
+onDeactivated(() => {
+  tempDocument = editor.editor.getDocument()
+})
+
+
+onActivated(async () => {
+  const id = router.currentRoute.value.query.id as string
+  if (id) {
+    if (textCode.value !== id) {
+      tempDocument = null
+    }
+    textCode.value = id
+    selectCrmPatientMiByCode()
+  }
+  await nextTick()
+  useEmrInit(emrDivRef.value, {appContext, event: emrEvent}).then((res: any) => {
+    editor = res
+    if (tempDocument) {
+      editor.editor.setDocument(tempDocument)
+      tempDocument = null
+    }
+  })
+})
+
+onMounted(async () => {
+  await queryCrmEmdrData(null, null)
+})
+
+</script>

+ 186 - 168
src/views/clinic/chronicDisease/ChronicDiseaseSearch.vue

@@ -1,87 +1,96 @@
 <template>
-    <page-layer>
-        <template #header>
-            <el-input v-model="keyCode" class="w-50 m-2" style="width: 360px" placeholder="请输入姓名/证件号/门诊号/住院号" clearable>
-                <template #prepend>关键字</template>
-            </el-input>
-            <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期"
-                end-placeholder="结束日期" :shortcuts="shortcuts" style="width: 360px;margin-left: 3px"></el-date-picker>
-            <el-select v-model="diseaseType" placeholder="请选择慢病类型" clearable style="width: 240px;margin-left: 3px">
-                <el-option v-for="item in dics.getCrmClass" :key="item.code" :label="item.name" :value="item.code" />
-            </el-select>
-            <el-button type="primary" icon="Search" @click="queryChronicDisease" style="margin-left: 5px">查询</el-button>
-            <el-button type="primary" icon="Download" @click="exportData" style="margin-left: 5px">导出</el-button>
-        </template>
-        <template #main>
-            <el-table :data="chronicDiseaseData.slice(pageSize * (currentPage - 1), pageSize * currentPage)" border
+  <page-layer>
+    <template #header>
+      <el-input v-model="keyCode" class="w-50 m-2" style="width: 360px" placeholder="请输入姓名/证件号/门诊号/住院号"
+                clearable>
+        <template #prepend>关键字</template>
+      </el-input>
+      <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期"
+                      end-placeholder="结束日期" :shortcuts="shortcuts"
+                      style="width: 360px;margin-left: 3px"></el-date-picker>
+      <el-select v-model="diseaseType" placeholder="请选择慢病类型" clearable style="width: 240px;margin-left: 3px">
+        <el-option v-for="item in dics.getCrmClass" :key="item.code" :label="item.name" :value="item.code"/>
+      </el-select>
+      <el-button type="primary" icon="Search" @click="queryChronicDisease" style="margin-left: 5px">查询</el-button>
+      <el-button type="primary" icon="Download" @click="exportData" style="margin-left: 5px">导出</el-button>
+    </template>
+    <template #main>
+      <el-table :data="chronicDiseaseData.slice(pageSize * (currentPage - 1), pageSize * currentPage)" border
                 style="width: 100%" :height="tableHeight" highlight-current-row :row-style="rowStyle">
-                <el-table-column type="index" label="序号" width="50" fixed />
-                <el-table-column prop="pName" label="姓名" width="100" fixed />
-                <el-table-column prop="socialNo" label="证件号" width="140" fixed />
-                <el-table-column prop="sexValue" label="性别" />
-                <el-table-column prop="age" label="年龄" />
-                <el-table-column prop="hisMzNo" label="门诊号" width="100" />
-                <el-table-column prop="hisZyNo" label="住院号" width="100" />
-                <el-table-column prop="days" label="剩余回访天数" width="100" />
-                <el-table-column prop="ptName" label="病人来源" width="120" />
-                <el-table-column prop="relTel" label="联系电话" width="100" />
-                <el-table-column prop="relNameTel" label="联系人电话" width="100" />
-                <el-table-column prop="relName" label="联系人姓名" width="100" />
-                <el-table-column prop="chronicDiseaseName" label="慢病类型" width="200" show-overflow-tooltip />
-                <el-table-column prop="lastDate" label="确诊时间" width="100" />
-                <el-table-column prop="pComment" label="患者重点随访监测事项" width="300" show-overflow-tooltip />
-                <el-table-column prop="importLevel" label="病人等级" width="100">
-                    <template #default="scope">
-                        <span v-if="scope.row.importLevel === '1'">未住院患者</span>
-                        <span v-else-if="scope.row.importLevel === '2'">住院一次患者</span>
-                        <span v-else-if="scope.row.importLevel === '3'">住院两次及以上</span>
-                        <span v-else>{{ scope.row.importLevel }}</span>
-                    </template>
-                </el-table-column>
-                <el-table-column prop="provinceName" label="省" width="100" />
-                <el-table-column prop="cityName" label="市" width="100" />
-                <el-table-column prop="areaName" label="区" width="100" />
-                <el-table-column prop="detailAdress" label="详细地址" width="300" show-overflow-tooltip />
-                <el-table-column prop="height" label="身高" width="80" />
-                <el-table-column prop="weight" label="体重" width="80" />
-                <el-table-column prop="temperature" label="体温" width="80" />
-                <el-table-column prop="heartRate" label="心率" width="80" />
-                <el-table-column prop="bloodPressure" label="收缩压/舒张压" width="100" />
-                <el-table-column prop="bloodSugar" label="血糖" width="80" />
-                <el-table-column prop="bloodOxygen" label="血氧" width="80" />
-                <el-table-column prop="referPhysicianName" label="主管医生" width="100" />
-                <el-table-column prop="userName" label="建档医生" width="100" />
-                <el-table-column prop="createDate" label="建卡时间" width="140" />
-                <el-table-column prop="visitDate" label="下次随访时间" width="100" />
-            </el-table>
-            <el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="[15, 30, 45, 60]"
-                :total="chronicDiseaseData.length" layout="total, sizes, prev, pager, next, jumper" style="margin-top: 5px"
-                @size-change="handleSizeChange" @current-change="handleCurrentChange">
-            </el-pagination>
-        </template>
-    </page-layer>
+        <el-table-column type="index" label="序号" width="50" fixed/>
+        <el-table-column prop="pName" label="姓名" width="100" fixed/>
+        <el-table-column prop="socialNo" label="证件号" width="140" fixed/>
+        <el-table-column prop="sexValue" label="性别"/>
+        <el-table-column prop="age" label="年龄"/>
+        <el-table-column prop="hisMzNo" label="门诊号" width="100"/>
+        <el-table-column prop="hisZyNo" label="住院号" width="100"/>
+        <el-table-column prop="days" label="剩余回访天数" width="100"/>
+        <el-table-column prop="ptName" label="病人来源" width="120"/>
+        <el-table-column prop="relTel" label="联系电话" width="100"/>
+        <el-table-column prop="relNameTel" label="联系人电话" width="100"/>
+        <el-table-column prop="relName" label="联系人姓名" width="100"/>
+        <el-table-column prop="chronicDiseaseName" label="慢病类型" width="200" show-overflow-tooltip/>
+        <el-table-column prop="lastDate" label="确诊时间" width="100"/>
+        <el-table-column prop="pComment" label="患者重点随访监测事项" width="300" show-overflow-tooltip/>
+        <el-table-column prop="importLevel" label="病人等级" width="100">
+          <template #default="scope">
+            <span v-if="scope.row.importLevel === '1'">未住院患者</span>
+            <span v-else-if="scope.row.importLevel === '2'">住院一次患者</span>
+            <span v-else-if="scope.row.importLevel === '3'">住院两次及以上</span>
+            <span v-else>{{ scope.row.importLevel }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="provinceName" label="省" width="100"/>
+        <el-table-column prop="cityName" label="市" width="100"/>
+        <el-table-column prop="areaName" label="区" width="100"/>
+        <el-table-column prop="detailAdress" label="详细地址" width="300" show-overflow-tooltip/>
+        <el-table-column prop="height" label="身高" width="80"/>
+        <el-table-column prop="weight" label="体重" width="80"/>
+        <el-table-column prop="temperature" label="体温" width="80"/>
+        <el-table-column prop="heartRate" label="心率" width="80"/>
+        <el-table-column prop="bloodPressure" label="舒张压/收缩压" width="100"/>
+        <el-table-column prop="bloodSugar" label="血糖" width="80"/>
+        <el-table-column prop="bloodOxygen" label="血氧" width="80"/>
+        <el-table-column prop="referPhysicianName" label="主管医生" width="100"/>
+        <el-table-column prop="userName" label="建档医生" width="100"/>
+        <el-table-column prop="createDate" label="建卡时间" width="140"/>
+        <el-table-column prop="visitDate" label="下次随访时间" width="100"/>
+        <el-table-column prop="visitDate" label="回访" width="100" fixed="right" align="center">
+          <template #default="{row}">
+            <el-button @click="followUpClick(row)" type="primary">回访</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="[15, 30, 45, 60]"
+                     :total="chronicDiseaseData.length" layout="total, sizes, prev, pager, next, jumper"
+                     style="margin-top: 5px"
+                     @size-change="handleSizeChange" @current-change="handleCurrentChange">
+      </el-pagination>
+    </template>
+  </page-layer>
 </template>
 <script setup name="ChronicDiseaseSearch">
-import { ref, onMounted, nextTick } from 'vue'
+import {ref, onMounted, nextTick} from 'vue'
 import PageLayer from '@/layout/PageLayer.vue'
 import store from '@/store'
-import { shortcuts, seltYearAndNowLast } from '@/data/shortcuts'
-import { formatDate, getDateRangeFormatDate } from '@/utils/date'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { selectChronicDisease, getCrmDictionary } from "@/api/chronic-disease/chronic-disease"
+import {shortcuts, seltYearAndNowLast} from '@/data/shortcuts'
+import {formatDate, getDateRangeFormatDate} from '@/utils/date'
+import {ElMessage, ElMessageBox} from 'element-plus'
+import {selectChronicDisease, getCrmDictionary} from "@/api/chronic-disease/chronic-disease"
 import DeptInformation from '@/views/dictionary/personnel/DeptInformation.vue'
-import { Export } from '@/utils/ExportExcel'
-import { clone } from '@/utils/clone'
+import {Export} from '@/utils/ExportExcel'
+import {clone} from '@/utils/clone'
+import router from "@/router";
 
 const windowSize = store.state.app.windowSize;
 const tableHeight = windowSize.h / 1.07;
 const pageSize = ref(30)
 const currentPage = ref(1)
 const handleSizeChange = (val) => {
-    pageSize.value = val
+  pageSize.value = val
 }
 const handleCurrentChange = (val) => {
-    currentPage.value = val
+  currentPage.value = val
 }
 const keyCode = ref('')
 const chronicDiseaseData = ref([])
@@ -91,121 +100,130 @@ const start = formatDate(seltYearAndNowLast[0].value[0])
 const end = formatDate(seltYearAndNowLast[0].value[1])
 const dateRange = ref([])
 const queryTerm = reactive({
-    startTime: '',
-    endTime: '',
-    keyCode: '',
-    diseaseType: '',
+  startTime: '',
+  endTime: '',
+  keyCode: '',
+  diseaseType: '',
 })
 
 onMounted(() => {
-    nextTick(async () => {
-        dics.value = await getCrmDictionary()
-        queryTerm.startTime = start
-        queryTerm.endTime = end + ' 23:59:59'
-        dateRange.value = [start, end]
-        queryChronicDisease()
-    })
+  nextTick(async () => {
+    dics.value = await getCrmDictionary()
+    queryTerm.startTime = start
+    queryTerm.endTime = end + ' 23:59:59'
+    dateRange.value = [start, end]
+    queryChronicDisease()
+  })
 })
 
 // 查询慢病首次登记信息
 const queryChronicDisease = () => {
-    if (dateRange.value) {
-        let dateS = getDateRangeFormatDate(dateRange.value)
-        queryTerm.startTime = dateS.startTime
-        queryTerm.endTime = dateS.endTime
-    } else {
-        queryTerm.startTime = start
-        queryTerm.endTime = end
-        ElMessage({
-            type: 'info',
-            message: '默认查询本月的数据',
-            duration: 2500,
-            showClose: true,
-        })
-    }
+  if (dateRange.value) {
+    let dateS = getDateRangeFormatDate(dateRange.value)
+    queryTerm.startTime = dateS.startTime
+    queryTerm.endTime = dateS.endTime
+  } else {
+    queryTerm.startTime = start
+    queryTerm.endTime = end
+    ElMessage({
+      type: 'info',
+      message: '默认查询本月的数据',
+      duration: 2500,
+      showClose: true,
+    })
+  }
 
-    queryTerm.keyCode = keyCode.value
-    queryTerm.diseaseType = diseaseType.value
-    selectChronicDisease(queryTerm)
-        .then((res) => {
-            chronicDiseaseData.value = res
-        });
+  queryTerm.keyCode = keyCode.value
+  queryTerm.diseaseType = diseaseType.value
+  selectChronicDisease(queryTerm)
+      .then((res) => {
+        chronicDiseaseData.value = res
+      });
 }
 
 const rowStyle = (row, rowIndex) => {
-    if (row.row.days <= 0) {
-        return {
-            backgroundColor: "#e60012 !important",
-            color: "#28A458 !important",
-            cursor: "pointer",
-        };
-    } else if (row.row.days > 0 && row.row.days <= 7) {
-        return {
-            backgroundColor: "#ecd452 !important",
-            color: "#28A458 !important",
-            cursor: "pointer",
-        };
+  if (row.row.days <= 0) {
+    return {
+      backgroundColor: "#e60012 !important",
+      color: "#28A458 !important",
+      cursor: "pointer",
+    };
+  } else if (row.row.days > 0 && row.row.days <= 7) {
+    return {
+      backgroundColor: "#ecd452 !important",
+      color: "#28A458 !important",
+      cursor: "pointer",
+    };
+  }
+  return {cursor: "pointer"};
+}
+
+function followUpClick({socialNo}) {
+  router.push({
+    name: 'chronicDiseaseQuestionnaire',
+    query: {
+      id: socialNo
     }
-    return { cursor: "pointer" };
+  })
 }
 
 // 导出慢病基础信息
 const exportData = () => {
-    if (chronicDiseaseData.value.length === 0) {
-        ElMessage({
-            message: "没有可以导出的数据!",
-            type: "warning",
-            duration: 2500,
-            showClose: true,
-        });
-    } else {
-        const title = {
-            pName: "姓名",
-            socialNo: "证件号",
-            sexValue: "性别",
-            age: "年龄",
-            hisMzNo: "门诊号",
-            hisZyNo: "住院号",
-            days: "剩余回访天数",
-            ptName: "病人来源",
-            relTel: "联系电话",
-            relNameTel: "联系人电话",
-            relName: "联系人姓名",
-            chronicDiseaseName: "慢病类型",
-            lastDate: "确诊时间",
-            pComment: "患者重点随访监测事项",
-            importLevel: "病人等级",
-            provinceName: "省",
-            cityName: "市",
-            areaName: "区",
-            detailAdress: "详细地址",
-            height: "身高",
-            weight: "体重",
-            temperature: "体温",
-            heartRate: "心率",
-            bloodPressure: "收缩压/舒张压",
-            bloodSugar: "血糖",
-            bloodOxygen: "血氧",
-            referPhysicianName: "主管医生",
-            userName: "建档医生",
-            createDate: "建卡时间",
-            visitDate: "下次随访时间",
-        };
+  if (chronicDiseaseData.value.length === 0) {
+    ElMessage({
+      message: "没有可以导出的数据!",
+      type: "warning",
+      duration: 2500,
+      showClose: true,
+    });
+  } else {
+    const title = {
+      pName: "姓名",
+      socialNo: "证件号",
+      sexValue: "性别",
+      age: "年龄",
+      hisMzNo: "门诊号",
+      hisZyNo: "住院号",
+      days: "剩余回访天数",
+      ptName: "病人来源",
+      relTel: "联系电话",
+      relNameTel: "联系人电话",
+      relName: "联系人姓名",
+      chronicDiseaseName: "慢病类型",
+      lastDate: "确诊时间",
+      pComment: "患者重点随访监测事项",
+      importLevel: "病人等级",
+      provinceName: "省",
+      cityName: "市",
+      areaName: "区",
+      detailAdress: "详细地址",
+      height: "身高",
+      weight: "体重",
+      temperature: "体温",
+      heartRate: "心率",
+      bloodPressure: "舒张压/收缩压",
+      bloodSugar: "血糖",
+      bloodOxygen: "血氧",
+      referPhysicianName: "主管医生",
+      userName: "建档医生",
+      createDate: "建卡时间",
+      visitDate: "下次随访时间",
+    };
 
-        let d = clone(chronicDiseaseData.value)
-        d.forEach(val => {
-            if (val.importLevel === '1') {
-                val.importLevel = '未住院患者'
-            } else if (val.importLevel === '2') {
-                val.importLevel = '住院一次患者'
-            } else if (val.importLevel === '3') {
-                val.importLevel = '住院两次及以上'
-            } else {
-                val.importLevel = ''
-            }
-        });
+    const d = clone(chronicDiseaseData.value)
+    d.forEach(val => {
+      if (val.importLevel === '1') {
+        val.importLevel = '未住院患者'
+      } else if (val.importLevel === '2') {
+        val.importLevel = '住院一次患者'
+      } else if (val.importLevel === '3') {
+        val.importLevel = '住院两次及以上'
+      } else {
+        val.importLevel = ''
+      }
+    });
 
-        Export(d, title, "慢病登记信息")
-    }
+    Export(d, title, "慢病登记信息")
+  }
 }
-</script>
+</script>