Browse Source

病程记录限制

xiaochan 2 years ago
parent
commit
dd935cf27a

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

@@ -368,9 +368,23 @@
                       maxlength="20"
                       minlength="1"
                       show-word-limit/>
+
+            <br> <br>
+
+            <el-alert type="warning" title="正在解析病程记录,请稍等。" v-if="解析病程提示"/>
+            <el-alert type="success" title="解析完成,点击确认即可。" v-else/>
+
             <template #footer>
-                <el-button @click="saveDialog.close" type="danger">取消</el-button>
-                <el-button @click="saveDialog.submit" type="primary">确认</el-button>
+                <el-button @click="saveDialog.close"
+                           :disabled="saveDialog.analyzeTheCourseOfTheDisease"
+                           type="danger">
+                    取消
+                </el-button>
+                <el-button @click="saveDialog.submit"
+                           :disabled="saveDialog.analyzeTheCourseOfTheDisease"
+                           type="primary">
+                    确认
+                </el-button>
             </template>
         </xc-dialog-v2>
 
@@ -471,6 +485,8 @@ let createId = null;
 let extractData = $ref({})
 let editorMod = $ref(false)
 
+let fragmentsCannotBeInserted = false
+
 let currentEditorUser = $ref(null)
 
 let foldBothSides = $ref({
@@ -534,7 +550,7 @@ const emrEvent = {
         // 设置 编辑器的模式
         setEditorModeFun()
         // 设置病程记录中的跳转锚点
-        courseSegmentLocking()
+        await courseSegmentLocking()
         // 设置病程记录跳转
         setTheProgressAnchor()
         // 删除指定的数据元
@@ -550,7 +566,6 @@ const emrEvent = {
         reQueryPatientInformation()
         // 每一个病历只能一个人编辑
         await editJudgment()
-
     },
 
     'contentchange': (e, op) => {
@@ -588,6 +603,7 @@ const emrEvent = {
         readonlyPattern()
     },
     "insertFragment": async (evt, rootView, nodes, fragment, defaultData) => {
+        fragmentsCannotBeInserted = true
         //插入的内容是区域片段
         if (nodes.length === 1 && nodes[0].view && nodes[0].view.type === 'area') {
             let view = nodes[0].view
@@ -596,15 +612,16 @@ const emrEvent = {
             let walker = modelService.createTreeWalker(node);
             let values = modelService.getElementsDataFromWalker(walker, '编辑者');
             let newDate = await getServerDateApi()
-            view.setAttribute('userInfo', {
+            view.setAttribute('fragment', {
+                name: values['查房标题'].value,
                 createId: userData.code,
                 createDate: newDate,
                 referPhysician: extractFields('管床医生编码'),
                 consultPhysician: extractFields('主治医生编码'),
                 deptDirector: extractFields('主任医生编码'),
-                name: values['查房标题'].value
             })
         }
+        fragmentsCannotBeInserted = false
     },
     "areaFocus": (evt, view) => {
         let modelService = editor.ModelService;
@@ -613,7 +630,9 @@ const emrEvent = {
         let walker = modelService.createTreeWalker(node);
         let values = modelService.getElementsDataFromWalker(walker, '编辑者');
         let editorCode = values['编辑者']?.value[0]?.code;
-        openTheTraceByUser(editorCode)
+        if (editorCode) {
+            openTheTraceByUser(editorCode)
+        }
     },
     "areaBlur": () => {
         // 区域失去焦点
@@ -627,9 +646,9 @@ let saveDialog = $ref({
     name: '',
     cb: null,
     err: null,
+    analyzeTheCourseOfTheDisease: false,
     prompt: (name, cb, err) => {
         saveDialog.name = name
-        saveDialog.dialog = true
         saveDialog.cb = cb
         saveDialog.err = err
         nextTick(async () => {
@@ -718,13 +737,16 @@ const clickSaveData = async () => {
         patNo: props.huanZheXinXi.inpatientNo,
         times: props.huanZheXinXi.admissTimes,
         emrName: templateName,
-        categoryId: categoryId
+        categoryId: categoryId,
+        fragment: []
     }
     objectValuesCannotBeNull(data)
     data.emrDataElement = editor.getDataElements('business')
     if (categoryCode === emrCodeEnum.courseRecord) {
         templateName = '病程记录'
     }
+    saveDialog.dialog = true
+    data.fragment = await 解析病程记录()
     saveDialog.prompt(templateName, async (value) => {
         data.name = value
         let newDate = await getServerDateApi()
@@ -928,6 +950,12 @@ const positioningTime = (val, code) => {
  * @param code 片段编码
  */
 const clickSnippet = async ({content, styles, code}) => {
+
+    // 为了防止上一次插入还没有完成,就再次插入了
+    if (fragmentsCannotBeInserted) {
+        BizException(ExceptionEnum.MESSAGE_ERROR, '请勿点击过快。')
+    }
+
     let temp = copyEnum[code]
     let data = patientData
     if (temp) {
@@ -1052,85 +1080,65 @@ const setTheProgressAnchor = () => {
  * 病程记录专用,
  * 设置段落锁定,和设置跳转锚点
  */
-const courseSegmentLocking = () => {
+const courseSegmentLocking = async () => {
     if (!categoryCode.includes(emrCodeEnum.courseRecord)) {
         return
     }
-    let root = currentEmr.value.getRoot()
-
     if (documentId) {
         let courseTitles = [];
         let loginUserCode = userData.code;
-        let modelService = editor.ModelService;
-        let walker, values;
-        for (let node of root.getChildren()) {
-            if (node.view && node.type === 'area') {
-                if (!walker) {
-                    walker = modelService.createTreeWalker(node);
-                } else {
-                    modelService.setWalkerRoot(walker, node);
-                }
-                values = modelService.getElementsDataFromWalker(walker, '编辑者');
-                // node.view.el.firstElementChild.textContent 如果title不是数据元
-                // values['查房标题'].value 如果title是数据元
-                setUpDiseaseCourseInfo(node, values)
-                courseTitles.push({
-                    code: '查房时间',
-                    name: values['查房标题']?.value,
-                    value: values['查房时间']?.value,
-                    emrDocumentId: documentId,
-                    emrCategoryCode: categoryCode,
-                    jump: true,
-                    createName: createName,
-                    createDate: values['查房时间']?.value,
-                    createId: createId,
-                    type: 'category'
-                })
-                if (emrConfig.value.editor) {
-                    let editorCode = values['编辑者']?.value[0]?.code;
-                    if (editorCode) {
-                        // 只有自己可以删除自己创建的片段
-                        if (editorCode === loginUserCode) {
+        await 循环病程返回数据元((value, node) => {
+            courseTitles.push({
+                code: '查房时间',
+                name: value['查房标题']?.value,
+                value: value['查房时间']?.value,
+                emrDocumentId: documentId,
+                emrCategoryCode: categoryCode,
+                jump: true,
+                createName: createName,
+                createDate: value['查房时间']?.value,
+                createId: createId,
+                type: 'category'
+            })
+            if (emrConfig.value.editor) {
+                let editorCode = value['编辑者']?.value[0]?.code;
+                if (editorCode) {
+                    // 只有自己可以删除自己创建的片段
+                    if (editorCode === loginUserCode) {
+                        node.view.setReadonly(false);
+                        node.view.setDeletable(true);
+                    } else if (doctorLevel === 1) {
+                        if (editorCode !== loginUserCode) {
+                            node.view.setReadonly(true);
+                            node.view.setDeletable(false);
+                        } else {
                             node.view.setReadonly(false);
-                            node.view.setDeletable(true);
-                        } else if (doctorLevel === 1) {
-                            if (editorCode !== loginUserCode) {
-                                node.view.setReadonly(true);
-                                node.view.setDeletable(false);
-                            } else {
-                                node.view.setReadonly(false);
-                                node.view.setDeletable(false);
-                            }
-                        } else if (doctorLevel === 2) {
-                            if (editorCode === extractFields('主任医生编码')) {
-                                node.view.setReadonly(true);
-                                node.view.setDeletable(false);
-                            } else {
-                                node.view.setReadonly(false);
-                                node.view.setDeletable(false);
-
-                            }
-                        } else if (doctorLevel === 3) {
+                            node.view.setDeletable(false);
+                        }
+                    } else if (doctorLevel === 2) {
+                        if (editorCode === extractFields('主任医生编码')) {
+                            node.view.setReadonly(true);
+                            node.view.setDeletable(false);
+                        } else {
                             node.view.setReadonly(false);
                             node.view.setDeletable(false);
 
                         }
+                    } else if (doctorLevel === 3) {
+                        node.view.setReadonly(false);
+                        node.view.setDeletable(false);
                     }
-                } else {
-                    node.view.setReadonly(true);
-                    node.view.setDeletable(false);
                 }
+            } else {
+                node.view.setReadonly(true);
+                node.view.setDeletable(false);
             }
-        }
+        })
         emrSidebarRef.value.diseaseDurationRecordTime(documentId, courseTitles);
     }
 }
 
 
-const setUpDiseaseCourseInfo = (node, values) => {
-    // console.log(node, values)
-}
-
 /**
  * 删除数据元,
  * 根据男性女性删除 月经史 数据元
@@ -1639,6 +1647,81 @@ const changeClear = () => {
     isEditorChange = false
 }
 
+const 解析病程记录 = async () => {
+    if (categoryCode !== emrCodeEnum.courseRecord) {
+        saveDialog.analyzeTheCourseOfTheDisease = false
+        return
+    }
+    saveDialog.analyzeTheCourseOfTheDisease = true
+    let fragment = []
+    await 循环病程返回数据元((values, node) => {
+        let data
+        let fragmentData = node.view.getAttribute('fragment')
+        // 以前老数据是没有的所以做不到质控
+        if (typeof fragmentData === 'undefined') {
+            data = {
+                name: values['查房标题']?.value,
+                createId: values['编辑者']?.value[0]?.code,
+                creationTime: values['查房时间']?.value,
+                referPhysician: values['编辑者']?.value[0]?.code,
+                consultPhysician: values['上级医师签名']?.value[0]?.code,
+                deptDirector: extractFields('主任医生编码'),
+            }
+            if (!data.name) {
+                positioningTime(data.creationTime, '查房时间')
+                saveDialog.close()
+                BizException(ExceptionEnum.MESSAGE_ERROR, '片段中存在异常标题,请检查。')
+            }
+            if (!data.creationTime) {
+                saveDialog.close()
+                BizException(ExceptionEnum.MESSAGE_ERROR, '片段中存在异常查房时间,请检查。')
+            }
+            node.view.setAttribute('fragment', data)
+        } else {
+            data = {
+                name: values['查房标题']?.value,
+                createId: fragmentData.createId,
+                creationTime: fragmentData.createDate,
+                referPhysician: extractFields('管床医生编码'),
+                consultPhysician: extractFields('主治医生编码'),
+                deptDirector: extractFields('主任医生编码'),
+            }
+        }
+        fragment.push(data)
+    })
+    saveDialog.analyzeTheCourseOfTheDisease = false
+    return fragment
+}
+
+const 解析病程提示 = computed(() => {
+    if (categoryCode !== emrCodeEnum.courseRecord) {
+        return false
+    } else {
+        return saveDialog.analyzeTheCourseOfTheDisease
+    }
+})
+
+const 循环病程返回数据元 = (callback) => {
+    return new Promise((resolve, reject) => {
+        let root = currentEmr.value.getRoot()
+        let walker, values;
+        let modelService = editor.ModelService;
+        for (let node of root.getChildren()) {
+            if (node.view && node.type === 'area') {
+                if (!walker) {
+                    walker = modelService.createTreeWalker(node);
+                } else {
+                    modelService.setWalkerRoot(walker, node);
+                }
+                values = modelService.getElementsDataFromWalker(walker, '编辑者');
+                callback(values, node)
+            }
+        }
+        resolve()
+    })
+}
+
+
 defineExpose({
     closeBothSides,
     headerRef,