import type { InjectionKey, ShallowRef } from "vue"; import { getPatientAll } from "@/api/inpatient/patient"; import * as archiveApi from "@/api/archive/archive-api"; import { getPatientArchives, PatientArchive, submitTask, } from "@/api/archive/archive-api"; import XEUtils from "xe-utils"; import { useWebSocket } from "@vueuse/core"; import { useUserStore } from "@/pinia/user-store"; import { useDialog } from "@/components/cy/CyDialog/index"; import ArchiveUpload from "./ArchiveUpload.vue"; import ArchiveAllLog from "@/views/archive/ArchiveAllLog.vue"; import { ElButton, ElNotification } from "element-plus"; type PatInfo = { inpatientNo: string; admissTimes: number; admissDate: string; disDate: string; }; type Socket = { [key: string]: (value: any) => void; }; const useSocket = (cb: Socket) => { const socketUrl = ref(); const { data, open } = useWebSocket(socketUrl, { immediate: false, }); watch( () => data.value, () => { try { const json = JSON.parse(data.value); cb[json.code]?.(json.data); } catch (e) { console.error(e); } }, { immediate: false, deep: true } ); return { setUrl(url: string) { socketUrl.value = url; open(); }, }; }; export const useArchive = () => { const store = reactive({ patNo: "", times: 0, patInfo: {} as PatInfo, treeList: [] as PatientArchive[], pdfUrl: "", asideValue: "archive", footerValue: "footer", footerVisible: true, logMessage: [], footerRef: null as ShallowRef<{ scroll: (val: boolean) => void }>, mainIframe: null as HTMLIFrameElement, mainTabsValue: "pdf", }); function notification(message) { const MessageNode = (
{message}
ElNotification.closeAll()} > 取消 { ElNotification.closeAll(); mutation.getData(); }} > 更新目录
); ElNotification.success({ title: "文件有变化", position: "bottom-right", duration: 0, message: MessageNode, }); } const socket = useSocket({ log: data => { store.logMessage.push(JSON.parse(data)); store.footerVisible = true; mutation.logScroll(false); }, change: data => { if (useUserStore().userInfo.code !== data.code) { notification(data.message); } }, taskComplete: () => { mutation.getData(); }, }); const mutation = { async getData() { store.treeList = await getPatientArchives(store.patNo, store.times); }, async setPatInfo(patInfo: string) { const split = patInfo.split("_"); store.patNo = split[0]; store.times = XEUtils.toNumber(split[1]); socket.setUrl( `${import.meta.env.VITE_SOCKET_URL}archive-${store.patNo}-${store.times}-${useUserStore().userInfo.code}` ); const res = await getPatientAll(store.patNo, store.times); store.patInfo = res as any; this.getData(); }, setPdfUrl(url: string) { store.mainIframe?.contentWindow?.scrollTo(0, 0); store.pdfUrl = "/thyyemrpdfserver" + url; }, async sort() { function forEach( data: PatientArchive[], fatherLevel: PatientArchive | null = null ) { data.forEach((item, index) => { if (fatherLevel) { item.parentId = fatherLevel.id; } else { item.parentId = null; } item.sort = index; if (item.children !== null && item.children.length > 0) { forEach(item.children, item); } }); } forEach(store.treeList); const tmp = { patNo: store.patInfo.inpatientNo, times: store.patInfo.admissTimes, archives: mutation.toTreeArray(), }; await archiveApi.sort(tmp); }, toTreeArray(): PatientArchive[] { return XEUtils.toTreeArray(XEUtils.cloneDeep(store.treeList), { clear: true, }); }, archiveTask() { submitTask([{ patNo: store.patNo, times: store.times }]); }, clearLog() { store.logMessage = []; }, async logScroll(top = false) { await nextTick(); store.footerRef?.scroll?.(top); }, async uploadFiles(parent: string) { await useDialog(ArchiveUpload, { dialogProps: { title: "上传文件", closeOnClickModal: false, showClose: false, closeOnPressEscape: false, }, showCancel: false, params: { patNo: store.patInfo.inpatientNo, times: store.patInfo.admissTimes, parent, }, }); await mutation.getData(); }, getPatNoAndTimes() { return { patNo: store.patInfo.inpatientNo, times: store.patInfo.admissTimes, }; }, getAllLog() { useDialog(ArchiveAllLog, { dialogProps: { title: "全部日志", fullscreen: true }, showCancel: false, params: { ...mutation.getPatNoAndTimes(), }, }).catch(XEUtils.noop); }, }; return { store, mutation }; }; type UseArchive = ReturnType; export const useArchiveKey: InjectionKey = Symbol("useArchiveKey");