|
@@ -270,16 +270,20 @@
|
|
|
创建:{{ createName }}
|
|
|
<br>
|
|
|
当前:{{ userData.name }}
|
|
|
+ <br>
|
|
|
+ 现编辑:{{ currentEditorUser?.name }}
|
|
|
</div>
|
|
|
|
|
|
<div>
|
|
|
等级:{{ createLevel }}
|
|
|
<br>
|
|
|
等级:{{ doctorLevel }}
|
|
|
+ <br>
|
|
|
+ 科室:{{ currentEditorUser?.deptName }}
|
|
|
</div>
|
|
|
|
|
|
<div class="edit_mode">
|
|
|
- 模式:{{ readonlyPattern() ? '只读' : '编辑' }}
|
|
|
+ 模式:{{ editorMod ? '只读' : '编辑' }}
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
@@ -316,6 +320,10 @@
|
|
|
</template>
|
|
|
</xc-dialog-v2>
|
|
|
|
|
|
+ <emr-web-socket :pat-info="props.huanZheXinXi"
|
|
|
+ :current-editor-user="currentEditorUser"
|
|
|
+ ref="emrSocket"/>
|
|
|
+
|
|
|
</el-container>
|
|
|
</template>
|
|
|
|
|
@@ -339,7 +347,6 @@ import {
|
|
|
submitMedicalRecord
|
|
|
} from "@/api/zhu-yuan-yi-sheng/emr-patient";
|
|
|
import {useDocumentVisibility} from "@vueuse/core";
|
|
|
-import EmrAssistant from "@/components/zhu-yuan-yi-sheng/emr/EmrAssistant.vue";
|
|
|
import XcDialogV2 from "@/components/xiao-chan/dialog/XcDialogV2.vue";
|
|
|
import {getWardsApi} from "@/api/login";
|
|
|
import {xcMessage} from "@/utils/xiaochan-element-plus";
|
|
@@ -347,9 +354,10 @@ import EmrUnorderedList from "@/components/zhu-yuan-yi-sheng/emr/EmrUnorderedLis
|
|
|
import HistoricalEmr from "@/components/zhu-yuan-yi-sheng/emr/HistoricalEmr.vue";
|
|
|
import EmrPopup from "@/components/zhu-yuan-yi-sheng/emr/EmrPopup.vue";
|
|
|
import EmrAuxiliaryTools from "@/components/zhu-yuan-yi-sheng/emr/auxiliary-tools/EmrAuxiliaryTools.vue";
|
|
|
-import {isDev} from "@/utils/public";
|
|
|
import sleep from "@/utils/sleep";
|
|
|
-import {initWebSocket} from "@/views/hospitalization/zhu-yuan-yi-sheng/electronic-medical-record/emr-editor/emr-socket";
|
|
|
+import EmrWebSocket from "@/components/zhu-yuan-yi-sheng/emr/web-socket/EmrWebSocket.vue";
|
|
|
+import {stringIsBlank, stringNotBlank} from "@/utils/blank-utils";
|
|
|
+import {clearTheCurrentMedicalRecordUser, lockMedicalRecords} from "@/api/zhu-yuan-yi-sheng/emr-socket";
|
|
|
|
|
|
const props = defineProps({
|
|
|
huanZheXinXi: {
|
|
@@ -368,6 +376,7 @@ const props = defineProps({
|
|
|
|
|
|
const currentEmr = ref(null)
|
|
|
const emrRef = ref(null)
|
|
|
+const emrSocket = ref(null)
|
|
|
|
|
|
let recoveryDialog = $ref(false)
|
|
|
let categoryCode = $ref('')
|
|
@@ -403,6 +412,9 @@ let wardList = []
|
|
|
let createId = null;
|
|
|
// 获取提取到的数据。
|
|
|
let extractData = $ref({})
|
|
|
+let editorMod = $ref(false)
|
|
|
+
|
|
|
+let currentEditorUser = $ref(null)
|
|
|
|
|
|
let foldBothSides = $ref({
|
|
|
isLeft: true,
|
|
@@ -463,6 +475,8 @@ const emrEvent = {
|
|
|
isRevisionMode()
|
|
|
// 判断是否只读
|
|
|
readonlyPattern()
|
|
|
+ // 每一个病历只能一个人编辑
|
|
|
+ editJudgment()
|
|
|
},
|
|
|
|
|
|
'contentchange': (event) => {
|
|
@@ -536,11 +550,54 @@ let saveDialog = $ref({
|
|
|
}
|
|
|
})
|
|
|
|
|
|
+const editJudgment = async () => {
|
|
|
+ if (stringIsBlank(documentId)) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (categoryCode.includes('shoucibingchengjilu')) {
|
|
|
+ currentEditorUser = await lockMedicalRecords(documentId)
|
|
|
+ if (currentEditorUser === null) {
|
|
|
+ xcMessage.success('可以编辑')
|
|
|
+ } else {
|
|
|
+ ElMessageBox.alert(`【${currentEditorUser.name}】正在编辑当前病历,请医生先退出病历后才能编辑。`, '提示', {
|
|
|
+ type: 'error',
|
|
|
+ dangerouslyUseHTMLString: true,
|
|
|
+ })
|
|
|
+ editor.setEditorMode('readonly')
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (readonlyPattern()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ currentEditorUser = await lockMedicalRecords(documentId)
|
|
|
+ if (currentEditorUser === null) {
|
|
|
+ xcMessage.success('可以编辑')
|
|
|
+ } else {
|
|
|
+ ElMessageBox.alert(`【${currentEditorUser.name}】正在编辑当前病历,请医生先退出病历后才能编辑。`, '提示', {
|
|
|
+ type: 'error',
|
|
|
+ dangerouslyUseHTMLString: true,
|
|
|
+ })
|
|
|
+ editor.setEditorMode('readonly')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ readonlyPattern()
|
|
|
+}
|
|
|
+
|
|
|
+watch(() => documentId, async (value, oldValue) => {
|
|
|
+ await clearMedicalRecordEditorUser(oldValue)
|
|
|
+}, {deep: true})
|
|
|
+
|
|
|
+const clearMedicalRecordEditorUser = async (id) => {
|
|
|
+ if (stringNotBlank(id)) {
|
|
|
+ await clearTheCurrentMedicalRecordUser(id)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// 点击保存病历
|
|
|
const clickSaveData = async () => {
|
|
|
// 只读模式无法保存数据
|
|
|
if (readonlyPattern()) {
|
|
|
- BizException(ExceptionEnum.LOGICAL_ERROR, "当前为只读模式,无法保存病历。");
|
|
|
+ BizException(ExceptionEnum.MESSAGE_ERROR, "当前为只读模式,无法保存病历。");
|
|
|
}
|
|
|
if (editor === null) return
|
|
|
waitForLoadingToComplete()
|
|
@@ -677,6 +734,9 @@ const whetherThereIsAMedicalRecordId = () => {
|
|
|
}
|
|
|
|
|
|
const checkEmrChange = (cb) => {
|
|
|
+ if (readonlyPattern()) {
|
|
|
+ isEditorChange = false
|
|
|
+ }
|
|
|
if (isEditorChange) {
|
|
|
ElMessageBox.confirm("您改变了数据是否要保存,不保存可能会丢失数据。", '提示', {
|
|
|
type: "warning",
|
|
@@ -700,6 +760,7 @@ const checkEmrChange = (cb) => {
|
|
|
let createName = $ref()
|
|
|
let createLevel = $ref(3)
|
|
|
const nodeClick = (val, jumpOrNot, templateType) => {
|
|
|
+
|
|
|
createName = val.createName
|
|
|
createId = val.createId
|
|
|
if (jumpOrNot) {
|
|
@@ -713,9 +774,11 @@ const nodeClick = (val, jumpOrNot, templateType) => {
|
|
|
}
|
|
|
}
|
|
|
} else {
|
|
|
+
|
|
|
checkEmrChange(() => {
|
|
|
updateCaseHistoryUrl(val);
|
|
|
- })
|
|
|
+ });
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -761,7 +824,8 @@ const positioningTime = (val, code) => {
|
|
|
const monitorPageRefresh = (event) => {
|
|
|
if (isEditorChange) {
|
|
|
event.preventDefault();
|
|
|
- return event.returnValue = "是否确实要退出?还有未保存的数据!";
|
|
|
+ clearMedicalRecordEditorUser(documentId)
|
|
|
+ event.returnValue = "是否确实要退出?还有未保存的数据!";
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -781,27 +845,28 @@ const clickSnippet = ({content, styles, code}) => {
|
|
|
delEmrCopy(temp)
|
|
|
}
|
|
|
}
|
|
|
- if (!readonlyPattern()) {
|
|
|
- let root = editor.model.document.getRoot()
|
|
|
- let lastView = root.getChild(root.childCount - 1).view
|
|
|
- lastView.setAttribute('readonly', false)
|
|
|
- //移动到文档结尾
|
|
|
- editor.setCursor('DOCUMENT_END');
|
|
|
- editor.scrollToCursor()
|
|
|
- let insertContent = {
|
|
|
- // 内容
|
|
|
- value: content,
|
|
|
- // 样式
|
|
|
- styles: styles,
|
|
|
- isFragment: true,
|
|
|
- // 就是在这里填充的值
|
|
|
- defaultData: data
|
|
|
- }
|
|
|
- editor.execute("insertContents", insertContent);
|
|
|
- lastView.setAttribute('readonly', true)
|
|
|
- editor.setCursor('DOCUMENT_END');
|
|
|
- editor.scrollToCursor()
|
|
|
+ if (readonlyPattern()) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ let root = editor.model.document.getRoot()
|
|
|
+ let lastView = root.getChild(root.childCount - 1).view
|
|
|
+ lastView.setAttribute('readonly', false)
|
|
|
+ // 移动到文档结尾
|
|
|
+ editor.setCursor('DOCUMENT_END');
|
|
|
+ editor.scrollToCursor()
|
|
|
+ let insertContent = {
|
|
|
+ // 内容
|
|
|
+ value: content,
|
|
|
+ // 样式
|
|
|
+ styles: styles,
|
|
|
+ isFragment: true,
|
|
|
+ // 就是在这里填充的值
|
|
|
+ defaultData: data
|
|
|
}
|
|
|
+ editor.execute("insertContents", insertContent);
|
|
|
+ lastView.setAttribute('readonly', true)
|
|
|
+ editor.setCursor('DOCUMENT_END');
|
|
|
+ editor.scrollToCursor()
|
|
|
}
|
|
|
|
|
|
// 用户信息
|
|
@@ -1027,6 +1092,7 @@ const drgIntelligentGrouping = () => {
|
|
|
|
|
|
// true 是只读 false 不是只读
|
|
|
const readonlyPattern = () => {
|
|
|
+ editorMod = (editor !== null && editor.getEditorMode() === 'readonly')
|
|
|
return editor !== null && editor.getEditorMode() === 'readonly';
|
|
|
}
|
|
|
|
|
@@ -1294,12 +1360,8 @@ const autoSaveFunc = () => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-onMounted(async () => {
|
|
|
- if (props.huanZheXinXi.inpatientNo) {
|
|
|
- initWebSocket(props.huanZheXinXi.inpatientNo + '-' + userData.code);
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
+onMounted(async () => {
|
|
|
autoSave = store.state.app.emrAutosave;
|
|
|
autoSaveChange()
|
|
|
extractData = await getExtractDataElement(props.huanZheXinXi.inpatientNo, props.huanZheXinXi.admissTimes)
|
|
@@ -1334,6 +1396,7 @@ onDeactivated(() => {
|
|
|
onBeforeRouteLeave((to, from, next) => {
|
|
|
checkEmrChange(() => {
|
|
|
next();
|
|
|
+ clearMedicalRecordEditorUser(documentId)
|
|
|
})
|
|
|
})
|
|
|
|